Added more strict checks for empty inputs to compare, meanStdDev and RNG::fill
[platform/upstream/opencv.git] / modules / core / src / ocl_deprecated.hpp
1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
4
5 /*
6   Part of the file is an extract from the standard OpenCL headers from Khronos site.
7   Below is the original copyright.
8 */
9
10 /*******************************************************************************
11  * Copyright (c) 2008 - 2012 The Khronos Group Inc.
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining a
14  * copy of this software and/or associated documentation files (the
15  * "Materials"), to deal in the Materials without restriction, including
16  * without limitation the rights to use, copy, modify, merge, publish,
17  * distribute, sublicense, and/or sell copies of the Materials, and to
18  * permit persons to whom the Materials are furnished to do so, subject to
19  * the following conditions:
20  *
21  * The above copyright notice and this permission notice shall be included
22  * in all copies or substantial portions of the Materials.
23  *
24  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
28  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
29  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
30  * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
31  ******************************************************************************/
32
33 #if 0 //defined __APPLE__
34 #define HAVE_OPENCL 1
35 #else
36 #undef HAVE_OPENCL
37 #endif
38
39 #define OPENCV_CL_NOT_IMPLEMENTED -1000
40
41 #ifdef HAVE_OPENCL
42
43 #if defined __APPLE__
44 #include <OpenCL/opencl.h>
45 #else
46 #include <CL/opencl.h>
47 #endif
48
49 static const bool g_haveOpenCL = true;
50
51 #else
52
53 extern "C" {
54
55 struct _cl_platform_id { int dummy; };
56 struct _cl_device_id { int dummy; };
57 struct _cl_context { int dummy; };
58 struct _cl_command_queue { int dummy; };
59 struct _cl_mem { int dummy; };
60 struct _cl_program { int dummy; };
61 struct _cl_kernel { int dummy; };
62 struct _cl_event { int dummy; };
63 struct _cl_sampler { int dummy; };
64
65 typedef struct _cl_platform_id *    cl_platform_id;
66 typedef struct _cl_device_id *      cl_device_id;
67 typedef struct _cl_context *        cl_context;
68 typedef struct _cl_command_queue *  cl_command_queue;
69 typedef struct _cl_mem *            cl_mem;
70 typedef struct _cl_program *        cl_program;
71 typedef struct _cl_kernel *         cl_kernel;
72 typedef struct _cl_event *          cl_event;
73 typedef struct _cl_sampler *        cl_sampler;
74
75 typedef int cl_int;
76 typedef unsigned cl_uint;
77 #if defined (_WIN32) && defined(_MSC_VER)
78     typedef __int64 cl_long;
79     typedef unsigned __int64 cl_ulong;
80 #else
81     typedef long cl_long;
82     typedef unsigned long cl_ulong;
83 #endif
84
85 typedef cl_uint             cl_bool; /* WARNING!  Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */
86 typedef cl_ulong            cl_bitfield;
87 typedef cl_bitfield         cl_device_type;
88 typedef cl_uint             cl_platform_info;
89 typedef cl_uint             cl_device_info;
90 typedef cl_bitfield         cl_device_fp_config;
91 typedef cl_uint             cl_device_mem_cache_type;
92 typedef cl_uint             cl_device_local_mem_type;
93 typedef cl_bitfield         cl_device_exec_capabilities;
94 typedef cl_bitfield         cl_command_queue_properties;
95 typedef intptr_t            cl_device_partition_property;
96 typedef cl_bitfield         cl_device_affinity_domain;
97
98 typedef intptr_t            cl_context_properties;
99 typedef cl_uint             cl_context_info;
100 typedef cl_uint             cl_command_queue_info;
101 typedef cl_uint             cl_channel_order;
102 typedef cl_uint             cl_channel_type;
103 typedef cl_bitfield         cl_mem_flags;
104 typedef cl_uint             cl_mem_object_type;
105 typedef cl_uint             cl_mem_info;
106 typedef cl_bitfield         cl_mem_migration_flags;
107 typedef cl_uint             cl_image_info;
108 typedef cl_uint             cl_buffer_create_type;
109 typedef cl_uint             cl_addressing_mode;
110 typedef cl_uint             cl_filter_mode;
111 typedef cl_uint             cl_sampler_info;
112 typedef cl_bitfield         cl_map_flags;
113 typedef cl_uint             cl_program_info;
114 typedef cl_uint             cl_program_build_info;
115 typedef cl_uint             cl_program_binary_type;
116 typedef cl_int              cl_build_status;
117 typedef cl_uint             cl_kernel_info;
118 typedef cl_uint             cl_kernel_arg_info;
119 typedef cl_uint             cl_kernel_arg_address_qualifier;
120 typedef cl_uint             cl_kernel_arg_access_qualifier;
121 typedef cl_bitfield         cl_kernel_arg_type_qualifier;
122 typedef cl_uint             cl_kernel_work_group_info;
123 typedef cl_uint             cl_event_info;
124 typedef cl_uint             cl_command_type;
125 typedef cl_uint             cl_profiling_info;
126
127
128 typedef struct _cl_image_format {
129     cl_channel_order        image_channel_order;
130     cl_channel_type         image_channel_data_type;
131 } cl_image_format;
132
133 typedef struct _cl_image_desc {
134     cl_mem_object_type      image_type;
135     size_t                  image_width;
136     size_t                  image_height;
137     size_t                  image_depth;
138     size_t                  image_array_size;
139     size_t                  image_row_pitch;
140     size_t                  image_slice_pitch;
141     cl_uint                 num_mip_levels;
142     cl_uint                 num_samples;
143     cl_mem                  buffer;
144 } cl_image_desc;
145
146 typedef struct _cl_buffer_region {
147     size_t                  origin;
148     size_t                  size;
149 } cl_buffer_region;
150
151
152 //////////////////////////////////////////////////////////
153
154 #define CL_SUCCESS                                  0
155 #define CL_DEVICE_NOT_FOUND                         -1
156 #define CL_DEVICE_NOT_AVAILABLE                     -2
157 #define CL_COMPILER_NOT_AVAILABLE                   -3
158 #define CL_MEM_OBJECT_ALLOCATION_FAILURE            -4
159 #define CL_OUT_OF_RESOURCES                         -5
160 #define CL_OUT_OF_HOST_MEMORY                       -6
161 #define CL_PROFILING_INFO_NOT_AVAILABLE             -7
162 #define CL_MEM_COPY_OVERLAP                         -8
163 #define CL_IMAGE_FORMAT_MISMATCH                    -9
164 #define CL_IMAGE_FORMAT_NOT_SUPPORTED               -10
165 #define CL_BUILD_PROGRAM_FAILURE                    -11
166 #define CL_MAP_FAILURE                              -12
167 #define CL_MISALIGNED_SUB_BUFFER_OFFSET             -13
168 #define CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST -14
169 #define CL_COMPILE_PROGRAM_FAILURE                  -15
170 #define CL_LINKER_NOT_AVAILABLE                     -16
171 #define CL_LINK_PROGRAM_FAILURE                     -17
172 #define CL_DEVICE_PARTITION_FAILED                  -18
173 #define CL_KERNEL_ARG_INFO_NOT_AVAILABLE            -19
174
175 #define CL_INVALID_VALUE                            -30
176 #define CL_INVALID_DEVICE_TYPE                      -31
177 #define CL_INVALID_PLATFORM                         -32
178 #define CL_INVALID_DEVICE                           -33
179 #define CL_INVALID_CONTEXT                          -34
180 #define CL_INVALID_QUEUE_PROPERTIES                 -35
181 #define CL_INVALID_COMMAND_QUEUE                    -36
182 #define CL_INVALID_HOST_PTR                         -37
183 #define CL_INVALID_MEM_OBJECT                       -38
184 #define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR          -39
185 #define CL_INVALID_IMAGE_SIZE                       -40
186 #define CL_INVALID_SAMPLER                          -41
187 #define CL_INVALID_BINARY                           -42
188 #define CL_INVALID_BUILD_OPTIONS                    -43
189 #define CL_INVALID_PROGRAM                          -44
190 #define CL_INVALID_PROGRAM_EXECUTABLE               -45
191 #define CL_INVALID_KERNEL_NAME                      -46
192 #define CL_INVALID_KERNEL_DEFINITION                -47
193 #define CL_INVALID_KERNEL                           -48
194 #define CL_INVALID_ARG_INDEX                        -49
195 #define CL_INVALID_ARG_VALUE                        -50
196 #define CL_INVALID_ARG_SIZE                         -51
197 #define CL_INVALID_KERNEL_ARGS                      -52
198 #define CL_INVALID_WORK_DIMENSION                   -53
199 #define CL_INVALID_WORK_GROUP_SIZE                  -54
200 #define CL_INVALID_WORK_ITEM_SIZE                   -55
201 #define CL_INVALID_GLOBAL_OFFSET                    -56
202 #define CL_INVALID_EVENT_WAIT_LIST                  -57
203 #define CL_INVALID_EVENT                            -58
204 #define CL_INVALID_OPERATION                        -59
205 #define CL_INVALID_GL_OBJECT                        -60
206 #define CL_INVALID_BUFFER_SIZE                      -61
207 #define CL_INVALID_MIP_LEVEL                        -62
208 #define CL_INVALID_GLOBAL_WORK_SIZE                 -63
209 #define CL_INVALID_PROPERTY                         -64
210 #define CL_INVALID_IMAGE_DESCRIPTOR                 -65
211 #define CL_INVALID_COMPILER_OPTIONS                 -66
212 #define CL_INVALID_LINKER_OPTIONS                   -67
213 #define CL_INVALID_DEVICE_PARTITION_COUNT           -68
214
215 /*#define CL_VERSION_1_0                              1
216 #define CL_VERSION_1_1                              1
217 #define CL_VERSION_1_2                              1*/
218
219 #define CL_FALSE                                    0
220 #define CL_TRUE                                     1
221 #define CL_BLOCKING                                 CL_TRUE
222 #define CL_NON_BLOCKING                             CL_FALSE
223
224 #define CL_PLATFORM_PROFILE                         0x0900
225 #define CL_PLATFORM_VERSION                         0x0901
226 #define CL_PLATFORM_NAME                            0x0902
227 #define CL_PLATFORM_VENDOR                          0x0903
228 #define CL_PLATFORM_EXTENSIONS                      0x0904
229
230 #define CL_DEVICE_TYPE_DEFAULT                      (1 << 0)
231 #define CL_DEVICE_TYPE_CPU                          (1 << 1)
232 #define CL_DEVICE_TYPE_GPU                          (1 << 2)
233 #define CL_DEVICE_TYPE_ACCELERATOR                  (1 << 3)
234 #define CL_DEVICE_TYPE_CUSTOM                       (1 << 4)
235 #define CL_DEVICE_TYPE_ALL                          0xFFFFFFFF
236 #define CL_DEVICE_TYPE                              0x1000
237 #define CL_DEVICE_VENDOR_ID                         0x1001
238 #define CL_DEVICE_MAX_COMPUTE_UNITS                 0x1002
239 #define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS          0x1003
240 #define CL_DEVICE_MAX_WORK_GROUP_SIZE               0x1004
241 #define CL_DEVICE_MAX_WORK_ITEM_SIZES               0x1005
242 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR       0x1006
243 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT      0x1007
244 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT        0x1008
245 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG       0x1009
246 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT      0x100A
247 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE     0x100B
248 #define CL_DEVICE_MAX_CLOCK_FREQUENCY               0x100C
249 #define CL_DEVICE_ADDRESS_BITS                      0x100D
250 #define CL_DEVICE_MAX_READ_IMAGE_ARGS               0x100E
251 #define CL_DEVICE_MAX_WRITE_IMAGE_ARGS              0x100F
252 #define CL_DEVICE_MAX_MEM_ALLOC_SIZE                0x1010
253 #define CL_DEVICE_IMAGE2D_MAX_WIDTH                 0x1011
254 #define CL_DEVICE_IMAGE2D_MAX_HEIGHT                0x1012
255 #define CL_DEVICE_IMAGE3D_MAX_WIDTH                 0x1013
256 #define CL_DEVICE_IMAGE3D_MAX_HEIGHT                0x1014
257 #define CL_DEVICE_IMAGE3D_MAX_DEPTH                 0x1015
258 #define CL_DEVICE_IMAGE_SUPPORT                     0x1016
259 #define CL_DEVICE_MAX_PARAMETER_SIZE                0x1017
260 #define CL_DEVICE_MAX_SAMPLERS                      0x1018
261 #define CL_DEVICE_MEM_BASE_ADDR_ALIGN               0x1019
262 #define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE          0x101A
263 #define CL_DEVICE_SINGLE_FP_CONFIG                  0x101B
264 #define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE             0x101C
265 #define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE         0x101D
266 #define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE             0x101E
267 #define CL_DEVICE_GLOBAL_MEM_SIZE                   0x101F
268 #define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE          0x1020
269 #define CL_DEVICE_MAX_CONSTANT_ARGS                 0x1021
270 #define CL_DEVICE_LOCAL_MEM_TYPE                    0x1022
271 #define CL_DEVICE_LOCAL_MEM_SIZE                    0x1023
272 #define CL_DEVICE_ERROR_CORRECTION_SUPPORT          0x1024
273 #define CL_DEVICE_PROFILING_TIMER_RESOLUTION        0x1025
274 #define CL_DEVICE_ENDIAN_LITTLE                     0x1026
275 #define CL_DEVICE_AVAILABLE                         0x1027
276 #define CL_DEVICE_COMPILER_AVAILABLE                0x1028
277 #define CL_DEVICE_EXECUTION_CAPABILITIES            0x1029
278 #define CL_DEVICE_QUEUE_PROPERTIES                  0x102A
279 #define CL_DEVICE_NAME                              0x102B
280 #define CL_DEVICE_VENDOR                            0x102C
281 #define CL_DRIVER_VERSION                           0x102D
282 #define CL_DEVICE_PROFILE                           0x102E
283 #define CL_DEVICE_VERSION                           0x102F
284 #define CL_DEVICE_EXTENSIONS                        0x1030
285 #define CL_DEVICE_PLATFORM                          0x1031
286 #define CL_DEVICE_DOUBLE_FP_CONFIG                  0x1032
287 #define CL_DEVICE_HALF_FP_CONFIG                    0x1033
288 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF       0x1034
289 #define CL_DEVICE_HOST_UNIFIED_MEMORY               0x1035
290 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR          0x1036
291 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT         0x1037
292 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT           0x1038
293 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG          0x1039
294 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT         0x103A
295 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE        0x103B
296 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF          0x103C
297 #define CL_DEVICE_OPENCL_C_VERSION                  0x103D
298 #define CL_DEVICE_LINKER_AVAILABLE                  0x103E
299 #define CL_DEVICE_BUILT_IN_KERNELS                  0x103F
300 #define CL_DEVICE_IMAGE_MAX_BUFFER_SIZE             0x1040
301 #define CL_DEVICE_IMAGE_MAX_ARRAY_SIZE              0x1041
302 #define CL_DEVICE_PARENT_DEVICE                     0x1042
303 #define CL_DEVICE_PARTITION_MAX_SUB_DEVICES         0x1043
304 #define CL_DEVICE_PARTITION_PROPERTIES              0x1044
305 #define CL_DEVICE_PARTITION_AFFINITY_DOMAIN         0x1045
306 #define CL_DEVICE_PARTITION_TYPE                    0x1046
307 #define CL_DEVICE_REFERENCE_COUNT                   0x1047
308 #define CL_DEVICE_PREFERRED_INTEROP_USER_SYNC       0x1048
309 #define CL_DEVICE_PRINTF_BUFFER_SIZE                0x1049
310 #define CL_DEVICE_IMAGE_PITCH_ALIGNMENT             0x104A
311 #define CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT      0x104B
312
313 #define CL_FP_DENORM                                (1 << 0)
314 #define CL_FP_INF_NAN                               (1 << 1)
315 #define CL_FP_ROUND_TO_NEAREST                      (1 << 2)
316 #define CL_FP_ROUND_TO_ZERO                         (1 << 3)
317 #define CL_FP_ROUND_TO_INF                          (1 << 4)
318 #define CL_FP_FMA                                   (1 << 5)
319 #define CL_FP_SOFT_FLOAT                            (1 << 6)
320 #define CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT         (1 << 7)
321
322 #define CL_NONE                                     0x0
323 #define CL_READ_ONLY_CACHE                          0x1
324 #define CL_READ_WRITE_CACHE                         0x2
325 #define CL_LOCAL                                    0x1
326 #define CL_GLOBAL                                   0x2
327 #define CL_EXEC_KERNEL                              (1 << 0)
328 #define CL_EXEC_NATIVE_KERNEL                       (1 << 1)
329 #define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE      (1 << 0)
330 #define CL_QUEUE_PROFILING_ENABLE                   (1 << 1)
331
332 #define CL_CONTEXT_REFERENCE_COUNT                  0x1080
333 #define CL_CONTEXT_DEVICES                          0x1081
334 #define CL_CONTEXT_PROPERTIES                       0x1082
335 #define CL_CONTEXT_NUM_DEVICES                      0x1083
336 #define CL_CONTEXT_PLATFORM                         0x1084
337 #define CL_CONTEXT_INTEROP_USER_SYNC                0x1085
338
339 #define CL_DEVICE_PARTITION_EQUALLY                 0x1086
340 #define CL_DEVICE_PARTITION_BY_COUNTS               0x1087
341 #define CL_DEVICE_PARTITION_BY_COUNTS_LIST_END      0x0
342 #define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN      0x1088
343 #define CL_DEVICE_AFFINITY_DOMAIN_NUMA                     (1 << 0)
344 #define CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE                 (1 << 1)
345 #define CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE                 (1 << 2)
346 #define CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE                 (1 << 3)
347 #define CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE                 (1 << 4)
348 #define CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE       (1 << 5)
349 #define CL_QUEUE_CONTEXT                            0x1090
350 #define CL_QUEUE_DEVICE                             0x1091
351 #define CL_QUEUE_REFERENCE_COUNT                    0x1092
352 #define CL_QUEUE_PROPERTIES                         0x1093
353 #define CL_MEM_READ_WRITE                           (1 << 0)
354 #define CL_MEM_WRITE_ONLY                           (1 << 1)
355 #define CL_MEM_READ_ONLY                            (1 << 2)
356 #define CL_MEM_USE_HOST_PTR                         (1 << 3)
357 #define CL_MEM_ALLOC_HOST_PTR                       (1 << 4)
358 #define CL_MEM_COPY_HOST_PTR                        (1 << 5)
359 // reserved                                         (1 << 6)
360 #define CL_MEM_HOST_WRITE_ONLY                      (1 << 7)
361 #define CL_MEM_HOST_READ_ONLY                       (1 << 8)
362 #define CL_MEM_HOST_NO_ACCESS                       (1 << 9)
363 #define CL_MIGRATE_MEM_OBJECT_HOST                  (1 << 0)
364 #define CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED     (1 << 1)
365
366 #define CL_R                                        0x10B0
367 #define CL_A                                        0x10B1
368 #define CL_RG                                       0x10B2
369 #define CL_RA                                       0x10B3
370 #define CL_RGB                                      0x10B4
371 #define CL_RGBA                                     0x10B5
372 #define CL_BGRA                                     0x10B6
373 #define CL_ARGB                                     0x10B7
374 #define CL_INTENSITY                                0x10B8
375 #define CL_LUMINANCE                                0x10B9
376 #define CL_Rx                                       0x10BA
377 #define CL_RGx                                      0x10BB
378 #define CL_RGBx                                     0x10BC
379 #define CL_DEPTH                                    0x10BD
380 #define CL_DEPTH_STENCIL                            0x10BE
381
382 #define CL_SNORM_INT8                               0x10D0
383 #define CL_SNORM_INT16                              0x10D1
384 #define CL_UNORM_INT8                               0x10D2
385 #define CL_UNORM_INT16                              0x10D3
386 #define CL_UNORM_SHORT_565                          0x10D4
387 #define CL_UNORM_SHORT_555                          0x10D5
388 #define CL_UNORM_INT_101010                         0x10D6
389 #define CL_SIGNED_INT8                              0x10D7
390 #define CL_SIGNED_INT16                             0x10D8
391 #define CL_SIGNED_INT32                             0x10D9
392 #define CL_UNSIGNED_INT8                            0x10DA
393 #define CL_UNSIGNED_INT16                           0x10DB
394 #define CL_UNSIGNED_INT32                           0x10DC
395 #define CL_HALF_FLOAT                               0x10DD
396 #define CL_FLOAT                                    0x10DE
397 #define CL_UNORM_INT24                              0x10DF
398
399 #define CL_MEM_OBJECT_BUFFER                        0x10F0
400 #define CL_MEM_OBJECT_IMAGE2D                       0x10F1
401 #define CL_MEM_OBJECT_IMAGE3D                       0x10F2
402 #define CL_MEM_OBJECT_IMAGE2D_ARRAY                 0x10F3
403 #define CL_MEM_OBJECT_IMAGE1D                       0x10F4
404 #define CL_MEM_OBJECT_IMAGE1D_ARRAY                 0x10F5
405 #define CL_MEM_OBJECT_IMAGE1D_BUFFER                0x10F6
406
407 #define CL_MEM_TYPE                                 0x1100
408 #define CL_MEM_FLAGS                                0x1101
409 #define CL_MEM_SIZE                                 0x1102
410 #define CL_MEM_HOST_PTR                             0x1103
411 #define CL_MEM_MAP_COUNT                            0x1104
412 #define CL_MEM_REFERENCE_COUNT                      0x1105
413 #define CL_MEM_CONTEXT                              0x1106
414 #define CL_MEM_ASSOCIATED_MEMOBJECT                 0x1107
415 #define CL_MEM_OFFSET                               0x1108
416
417 #define CL_IMAGE_FORMAT                             0x1110
418 #define CL_IMAGE_ELEMENT_SIZE                       0x1111
419 #define CL_IMAGE_ROW_PITCH                          0x1112
420 #define CL_IMAGE_SLICE_PITCH                        0x1113
421 #define CL_IMAGE_WIDTH                              0x1114
422 #define CL_IMAGE_HEIGHT                             0x1115
423 #define CL_IMAGE_DEPTH                              0x1116
424 #define CL_IMAGE_ARRAY_SIZE                         0x1117
425 #define CL_IMAGE_BUFFER                             0x1118
426 #define CL_IMAGE_NUM_MIP_LEVELS                     0x1119
427 #define CL_IMAGE_NUM_SAMPLES                        0x111A
428
429 #define CL_ADDRESS_NONE                             0x1130
430 #define CL_ADDRESS_CLAMP_TO_EDGE                    0x1131
431 #define CL_ADDRESS_CLAMP                            0x1132
432 #define CL_ADDRESS_REPEAT                           0x1133
433 #define CL_ADDRESS_MIRRORED_REPEAT                  0x1134
434
435 #define CL_FILTER_NEAREST                           0x1140
436 #define CL_FILTER_LINEAR                            0x1141
437
438 #define CL_SAMPLER_REFERENCE_COUNT                  0x1150
439 #define CL_SAMPLER_CONTEXT                          0x1151
440 #define CL_SAMPLER_NORMALIZED_COORDS                0x1152
441 #define CL_SAMPLER_ADDRESSING_MODE                  0x1153
442 #define CL_SAMPLER_FILTER_MODE                      0x1154
443
444 #define CL_MAP_READ                                 (1 << 0)
445 #define CL_MAP_WRITE                                (1 << 1)
446 #define CL_MAP_WRITE_INVALIDATE_REGION              (1 << 2)
447
448 #define CL_PROGRAM_REFERENCE_COUNT                  0x1160
449 #define CL_PROGRAM_CONTEXT                          0x1161
450 #define CL_PROGRAM_NUM_DEVICES                      0x1162
451 #define CL_PROGRAM_DEVICES                          0x1163
452 #define CL_PROGRAM_SOURCE                           0x1164
453 #define CL_PROGRAM_BINARY_SIZES                     0x1165
454 #define CL_PROGRAM_BINARIES                         0x1166
455 #define CL_PROGRAM_NUM_KERNELS                      0x1167
456 #define CL_PROGRAM_KERNEL_NAMES                     0x1168
457 #define CL_PROGRAM_BUILD_STATUS                     0x1181
458 #define CL_PROGRAM_BUILD_OPTIONS                    0x1182
459 #define CL_PROGRAM_BUILD_LOG                        0x1183
460 #define CL_PROGRAM_BINARY_TYPE                      0x1184
461 #define CL_PROGRAM_BINARY_TYPE_NONE                 0x0
462 #define CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT      0x1
463 #define CL_PROGRAM_BINARY_TYPE_LIBRARY              0x2
464 #define CL_PROGRAM_BINARY_TYPE_EXECUTABLE           0x4
465
466 #define CL_BUILD_SUCCESS                            0
467 #define CL_BUILD_NONE                               -1
468 #define CL_BUILD_ERROR                              -2
469 #define CL_BUILD_IN_PROGRESS                        -3
470
471 #define CL_KERNEL_FUNCTION_NAME                     0x1190
472 #define CL_KERNEL_NUM_ARGS                          0x1191
473 #define CL_KERNEL_REFERENCE_COUNT                   0x1192
474 #define CL_KERNEL_CONTEXT                           0x1193
475 #define CL_KERNEL_PROGRAM                           0x1194
476 #define CL_KERNEL_ATTRIBUTES                        0x1195
477 #define CL_KERNEL_ARG_ADDRESS_QUALIFIER             0x1196
478 #define CL_KERNEL_ARG_ACCESS_QUALIFIER              0x1197
479 #define CL_KERNEL_ARG_TYPE_NAME                     0x1198
480 #define CL_KERNEL_ARG_TYPE_QUALIFIER                0x1199
481 #define CL_KERNEL_ARG_NAME                          0x119A
482 #define CL_KERNEL_ARG_ADDRESS_GLOBAL                0x119B
483 #define CL_KERNEL_ARG_ADDRESS_LOCAL                 0x119C
484 #define CL_KERNEL_ARG_ADDRESS_CONSTANT              0x119D
485 #define CL_KERNEL_ARG_ADDRESS_PRIVATE               0x119E
486 #define CL_KERNEL_ARG_ACCESS_READ_ONLY              0x11A0
487 #define CL_KERNEL_ARG_ACCESS_WRITE_ONLY             0x11A1
488 #define CL_KERNEL_ARG_ACCESS_READ_WRITE             0x11A2
489 #define CL_KERNEL_ARG_ACCESS_NONE                   0x11A3
490 #define CL_KERNEL_ARG_TYPE_NONE                     0
491 #define CL_KERNEL_ARG_TYPE_CONST                    (1 << 0)
492 #define CL_KERNEL_ARG_TYPE_RESTRICT                 (1 << 1)
493 #define CL_KERNEL_ARG_TYPE_VOLATILE                 (1 << 2)
494 #define CL_KERNEL_WORK_GROUP_SIZE                   0x11B0
495 #define CL_KERNEL_COMPILE_WORK_GROUP_SIZE           0x11B1
496 #define CL_KERNEL_LOCAL_MEM_SIZE                    0x11B2
497 #define CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x11B3
498 #define CL_KERNEL_PRIVATE_MEM_SIZE                  0x11B4
499 #define CL_KERNEL_GLOBAL_WORK_SIZE                  0x11B5
500
501 #define CL_EVENT_COMMAND_QUEUE                      0x11D0
502 #define CL_EVENT_COMMAND_TYPE                       0x11D1
503 #define CL_EVENT_REFERENCE_COUNT                    0x11D2
504 #define CL_EVENT_COMMAND_EXECUTION_STATUS           0x11D3
505 #define CL_EVENT_CONTEXT                            0x11D4
506
507 #define CL_COMMAND_NDRANGE_KERNEL                   0x11F0
508 #define CL_COMMAND_TASK                             0x11F1
509 #define CL_COMMAND_NATIVE_KERNEL                    0x11F2
510 #define CL_COMMAND_READ_BUFFER                      0x11F3
511 #define CL_COMMAND_WRITE_BUFFER                     0x11F4
512 #define CL_COMMAND_COPY_BUFFER                      0x11F5
513 #define CL_COMMAND_READ_IMAGE                       0x11F6
514 #define CL_COMMAND_WRITE_IMAGE                      0x11F7
515 #define CL_COMMAND_COPY_IMAGE                       0x11F8
516 #define CL_COMMAND_COPY_IMAGE_TO_BUFFER             0x11F9
517 #define CL_COMMAND_COPY_BUFFER_TO_IMAGE             0x11FA
518 #define CL_COMMAND_MAP_BUFFER                       0x11FB
519 #define CL_COMMAND_MAP_IMAGE                        0x11FC
520 #define CL_COMMAND_UNMAP_MEM_OBJECT                 0x11FD
521 #define CL_COMMAND_MARKER                           0x11FE
522 #define CL_COMMAND_ACQUIRE_GL_OBJECTS               0x11FF
523 #define CL_COMMAND_RELEASE_GL_OBJECTS               0x1200
524 #define CL_COMMAND_READ_BUFFER_RECT                 0x1201
525 #define CL_COMMAND_WRITE_BUFFER_RECT                0x1202
526 #define CL_COMMAND_COPY_BUFFER_RECT                 0x1203
527 #define CL_COMMAND_USER                             0x1204
528 #define CL_COMMAND_BARRIER                          0x1205
529 #define CL_COMMAND_MIGRATE_MEM_OBJECTS              0x1206
530 #define CL_COMMAND_FILL_BUFFER                      0x1207
531 #define CL_COMMAND_FILL_IMAGE                       0x1208
532
533 #define CL_COMPLETE                                 0x0
534 #define CL_RUNNING                                  0x1
535 #define CL_SUBMITTED                                0x2
536 #define CL_QUEUED                                   0x3
537 #define CL_BUFFER_CREATE_TYPE_REGION                0x1220
538
539 #define CL_PROFILING_COMMAND_QUEUED                 0x1280
540 #define CL_PROFILING_COMMAND_SUBMIT                 0x1281
541 #define CL_PROFILING_COMMAND_START                  0x1282
542 #define CL_PROFILING_COMMAND_END                    0x1283
543
544 #define CL_CALLBACK CV_STDCALL
545
546
547 #ifdef HAVE_OPENCL
548 static const char* oclFuncToCheck = "clEnqueueReadBufferRect";
549 static volatile bool g_haveOpenCL = false;
550 #endif
551
552 #if defined(__APPLE__) && defined(HAVE_OPENCL)
553 #include <dlfcn.h>
554
555 static void* initOpenCLAndLoad(const char* funcname)
556 {
557     static bool initialized = false;
558     static void* handle = 0;
559     if (!handle)
560     {
561         if(!initialized)
562         {
563             const char* oclpath = getenv("OPENCV_OPENCL_RUNTIME");
564             oclpath = oclpath && strlen(oclpath) > 0 ? oclpath :
565                 "/System/Library/Frameworks/OpenCL.framework/Versions/Current/OpenCL";
566             handle = dlopen(oclpath, RTLD_LAZY);
567             initialized = true;
568             g_haveOpenCL = handle != 0 && dlsym(handle, oclFuncToCheck) != 0;
569             if( g_haveOpenCL )
570                 fprintf(stderr, "Successfully loaded OpenCL v1.1+ runtime from %s\n", oclpath);
571             else
572                 fprintf(stderr, "Failed to load OpenCL runtime\n");
573         }
574         if(!handle)
575             return 0;
576     }
577
578     return funcname && handle ? dlsym(handle, funcname) : 0;
579 }
580
581 #elif defined _WIN32 && defined(HAVE_OPENCL)
582
583 #ifndef _WIN32_WINNT           // This is needed for the declaration of TryEnterCriticalSection in winbase.h with Visual Studio 2005 (and older?)
584   #define _WIN32_WINNT 0x0400  // http://msdn.microsoft.com/en-us/library/ms686857(VS.85).aspx
585 #endif
586 #include <windows.h>
587 #if (_WIN32_WINNT >= 0x0602)
588   #include <synchapi.h>
589 #endif
590 #undef small
591 #undef min
592 #undef max
593 #undef abs
594
595 static void* initOpenCLAndLoad(const char* funcname)
596 {
597     static bool initialized = false;
598     static HMODULE handle = 0;
599     if (!handle)
600     {
601 #ifndef WINRT
602         if(!initialized)
603         {
604             handle = LoadLibraryA("OpenCL.dll");
605             initialized = true;
606             g_haveOpenCL = handle != 0 && GetProcAddress(handle, oclFuncToCheck) != 0;
607         }
608 #endif
609         if(!handle)
610             return 0;
611     }
612
613     return funcname ? (void*)GetProcAddress(handle, funcname) : 0;
614 }
615
616 #elif defined(__linux) && defined(HAVE_OPENCL)
617
618 #include <dlfcn.h>
619 #include <stdio.h>
620
621 static void* initOpenCLAndLoad(const char* funcname)
622 {
623     static bool initialized = false;
624     static void* handle = 0;
625     if (!handle)
626     {
627         if(!initialized)
628         {
629             handle = dlopen("libOpenCL.so", RTLD_LAZY);
630             if(!handle)
631                 handle = dlopen("libCL.so", RTLD_LAZY);
632             initialized = true;
633             g_haveOpenCL = handle != 0 && dlsym(handle, oclFuncToCheck) != 0;
634         }
635         if(!handle)
636             return 0;
637     }
638
639     return funcname ? (void*)dlsym(handle, funcname) : 0;
640 }
641
642 #else
643
644 static void* initOpenCLAndLoad(const char*)
645 {
646     return 0;
647 }
648
649 #endif
650
651
652 #define OCL_FUNC(rettype, funcname, argsdecl, args) \
653     typedef rettype (CV_STDCALL * funcname##_t) argsdecl; \
654     static rettype funcname argsdecl \
655     { \
656         static funcname##_t funcname##_p = 0; \
657         if( !funcname##_p ) \
658         { \
659             funcname##_p = (funcname##_t)initOpenCLAndLoad(#funcname); \
660             if( !funcname##_p ) \
661                 return OPENCV_CL_NOT_IMPLEMENTED; \
662         } \
663         return funcname##_p args; \
664     }
665
666
667 #define OCL_FUNC_P(rettype, funcname, argsdecl, args) \
668     typedef rettype (CV_STDCALL * funcname##_t) argsdecl; \
669     static rettype funcname argsdecl \
670     { \
671         static funcname##_t funcname##_p = 0; \
672         if( !funcname##_p ) \
673         { \
674             funcname##_p = (funcname##_t)initOpenCLAndLoad(#funcname); \
675             if( !funcname##_p ) \
676             { \
677                 if( errcode_ret ) \
678                     *errcode_ret = OPENCV_CL_NOT_IMPLEMENTED; \
679                 return 0; \
680             } \
681         } \
682         return funcname##_p args; \
683     }
684
685 OCL_FUNC(cl_int, clGetPlatformIDs,
686     (cl_uint num_entries, cl_platform_id* platforms, cl_uint* num_platforms),
687     (num_entries, platforms, num_platforms))
688
689 OCL_FUNC(cl_int, clGetPlatformInfo,
690     (cl_platform_id platform, cl_platform_info param_name,
691     size_t param_value_size, void * param_value,
692     size_t * param_value_size_ret),
693     (platform, param_name, param_value_size, param_value, param_value_size_ret))
694
695 OCL_FUNC(cl_int, clGetDeviceInfo,
696          (cl_device_id device,
697           cl_device_info param_name,
698           size_t param_value_size,
699           void * param_value,
700           size_t * param_value_size_ret),
701          (device, param_name, param_value_size, param_value, param_value_size_ret))
702
703
704 OCL_FUNC(cl_int, clGetDeviceIDs,
705     (cl_platform_id platform,
706     cl_device_type device_type,
707     cl_uint num_entries,
708     cl_device_id * devices,
709     cl_uint * num_devices),
710     (platform, device_type, num_entries, devices, num_devices))
711
712 OCL_FUNC_P(cl_context, clCreateContext,
713     (const cl_context_properties * properties,
714     cl_uint num_devices,
715     const cl_device_id * devices,
716     void (CL_CALLBACK * pfn_notify)(const char *, const void *, size_t, void *),
717     void * user_data,
718     cl_int * errcode_ret),
719     (properties, num_devices, devices, pfn_notify, user_data, errcode_ret))
720
721 OCL_FUNC(cl_int, clReleaseContext, (cl_context context), (context))
722
723
724 OCL_FUNC(cl_int, clRetainContext, (cl_context context), (context))
725 /*
726 OCL_FUNC_P(cl_context, clCreateContextFromType,
727     (const cl_context_properties * properties,
728     cl_device_type device_type,
729     void (CL_CALLBACK * pfn_notify)(const char *, const void *, size_t, void *),
730     void * user_data,
731     cl_int * errcode_ret),
732     (properties, device_type, pfn_notify, user_data, errcode_ret))
733
734 OCL_FUNC(cl_int, clGetContextInfo,
735     (cl_context context,
736     cl_context_info param_name,
737     size_t param_value_size,
738     void * param_value,
739     size_t * param_value_size_ret),
740     (context, param_name, param_value_size,
741     param_value, param_value_size_ret))
742 */
743 OCL_FUNC_P(cl_command_queue, clCreateCommandQueue,
744     (cl_context context,
745     cl_device_id device,
746     cl_command_queue_properties properties,
747     cl_int * errcode_ret),
748     (context, device, properties, errcode_ret))
749
750 OCL_FUNC(cl_int, clReleaseCommandQueue, (cl_command_queue command_queue), (command_queue))
751
752 OCL_FUNC_P(cl_mem, clCreateBuffer,
753     (cl_context context,
754     cl_mem_flags flags,
755     size_t size,
756     void * host_ptr,
757     cl_int * errcode_ret),
758     (context, flags, size, host_ptr, errcode_ret))
759
760 /*
761 OCL_FUNC(cl_int, clRetainCommandQueue, (cl_command_queue command_queue), (command_queue))
762 */
763 OCL_FUNC(cl_int, clGetCommandQueueInfo,
764    (cl_command_queue command_queue,
765    cl_command_queue_info param_name,
766    size_t param_value_size,
767    void * param_value,
768    size_t * param_value_size_ret),
769    (command_queue, param_name, param_value_size, param_value, param_value_size_ret))
770 /*
771 OCL_FUNC_P(cl_mem, clCreateSubBuffer,
772     (cl_mem buffer,
773     cl_mem_flags flags,
774     cl_buffer_create_type buffer_create_type,
775     const void * buffer_create_info,
776     cl_int * errcode_ret),
777     (buffer, flags, buffer_create_type, buffer_create_info, errcode_ret))
778 */
779
780 OCL_FUNC_P(cl_mem, clCreateImage,
781     (cl_context context,
782     cl_mem_flags flags,
783     const cl_image_format * image_format,
784     const cl_image_desc * image_desc,
785     void * host_ptr,
786     cl_int * errcode_ret),
787     (context, flags, image_format, image_desc, host_ptr, errcode_ret))
788
789 OCL_FUNC_P(cl_mem, clCreateImage2D,
790     (cl_context context,
791     cl_mem_flags flags,
792     const cl_image_format * image_format,
793     size_t image_width,
794     size_t image_height,
795     size_t image_row_pitch,
796     void * host_ptr,
797     cl_int *errcode_ret),
798     (context, flags, image_format, image_width, image_height, image_row_pitch, host_ptr, errcode_ret))
799
800 OCL_FUNC(cl_int, clGetSupportedImageFormats,
801  (cl_context context,
802  cl_mem_flags flags,
803  cl_mem_object_type image_type,
804  cl_uint num_entries,
805  cl_image_format * image_formats,
806  cl_uint * num_image_formats),
807  (context, flags, image_type, num_entries, image_formats, num_image_formats))
808
809
810 OCL_FUNC(cl_int, clGetMemObjectInfo,
811  (cl_mem memobj,
812  cl_mem_info param_name,
813  size_t param_value_size,
814  void * param_value,
815  size_t * param_value_size_ret),
816  (memobj, param_name, param_value_size, param_value, param_value_size_ret))
817
818 OCL_FUNC(cl_int, clGetImageInfo,
819  (cl_mem image,
820  cl_image_info param_name,
821  size_t param_value_size,
822  void * param_value,
823  size_t * param_value_size_ret),
824  (image, param_name, param_value_size, param_value, param_value_size_ret))
825
826 /*
827 OCL_FUNC(cl_int, clCreateKernelsInProgram,
828  (cl_program program,
829  cl_uint num_kernels,
830  cl_kernel * kernels,
831  cl_uint * num_kernels_ret),
832  (program, num_kernels, kernels, num_kernels_ret))
833
834 OCL_FUNC(cl_int, clRetainKernel, (cl_kernel kernel), (kernel))
835
836 OCL_FUNC(cl_int, clGetKernelArgInfo,
837  (cl_kernel kernel,
838  cl_uint arg_indx,
839  cl_kernel_arg_info param_name,
840  size_t param_value_size,
841  void * param_value,
842  size_t * param_value_size_ret),
843  (kernel, arg_indx, param_name, param_value_size, param_value, param_value_size_ret))
844
845 OCL_FUNC(cl_int, clEnqueueReadImage,
846  (cl_command_queue command_queue,
847  cl_mem image,
848  cl_bool blocking_read,
849  const size_t * origin[3],
850  const size_t * region[3],
851  size_t row_pitch,
852  size_t slice_pitch,
853  void * ptr,
854  cl_uint num_events_in_wait_list,
855  const cl_event * event_wait_list,
856  cl_event * event),
857  (command_queue, image, blocking_read, origin, region,
858  row_pitch, slice_pitch,
859  ptr,
860  num_events_in_wait_list,
861  event_wait_list,
862  event))
863
864 OCL_FUNC(cl_int, clEnqueueWriteImage,
865  (cl_command_queue command_queue,
866  cl_mem image,
867  cl_bool blocking_write,
868  const size_t * origin[3],
869  const size_t * region[3],
870  size_t input_row_pitch,
871  size_t input_slice_pitch,
872  const void * ptr,
873  cl_uint num_events_in_wait_list,
874  const cl_event * event_wait_list,
875  cl_event * event),
876  (command_queue, image, blocking_write, origin, region, input_row_pitch,
877  input_slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event))
878
879 OCL_FUNC(cl_int, clEnqueueFillImage,
880  (cl_command_queue command_queue,
881  cl_mem image,
882  const void * fill_color,
883  const size_t * origin[3],
884  const size_t * region[3],
885  cl_uint num_events_in_wait_list,
886  const cl_event * event_wait_list,
887  cl_event * event),
888  (command_queue, image, fill_color, origin, region,
889  num_events_in_wait_list, event_wait_list, event))
890
891 OCL_FUNC(cl_int, clEnqueueCopyImage,
892  (cl_command_queue command_queue,
893  cl_mem src_image,
894  cl_mem dst_image,
895  const size_t * src_origin[3],
896  const size_t * dst_origin[3],
897  const size_t * region[3],
898  cl_uint num_events_in_wait_list,
899  const cl_event * event_wait_list,
900  cl_event * event),
901  (command_queue, src_image, dst_image, src_origin, dst_origin,
902  region, num_events_in_wait_list, event_wait_list, event))
903 */
904
905 OCL_FUNC(cl_int, clEnqueueCopyImageToBuffer,
906  (cl_command_queue command_queue,
907  cl_mem src_image,
908  cl_mem dst_buffer,
909  const size_t * src_origin,
910  const size_t * region,
911  size_t dst_offset,
912  cl_uint num_events_in_wait_list,
913  const cl_event * event_wait_list,
914  cl_event * event),
915  (command_queue, src_image, dst_buffer, src_origin, region, dst_offset,
916  num_events_in_wait_list, event_wait_list, event))
917
918 OCL_FUNC(cl_int, clEnqueueCopyBufferToImage,
919  (cl_command_queue command_queue,
920  cl_mem src_buffer,
921  cl_mem dst_image,
922  size_t src_offset,
923  const size_t dst_origin[3],
924  const size_t region[3],
925  cl_uint num_events_in_wait_list,
926  const cl_event * event_wait_list,
927  cl_event * event),
928  (command_queue, src_buffer, dst_image, src_offset, dst_origin,
929  region, num_events_in_wait_list, event_wait_list, event))
930
931  OCL_FUNC(cl_int, clFlush,
932  (cl_command_queue command_queue),
933  (command_queue))
934
935 /*
936 OCL_FUNC_P(void*, clEnqueueMapImage,
937  (cl_command_queue command_queue,
938  cl_mem image,
939  cl_bool blocking_map,
940  cl_map_flags map_flags,
941  const size_t * origin[3],
942  const size_t * region[3],
943  size_t * image_row_pitch,
944  size_t * image_slice_pitch,
945  cl_uint num_events_in_wait_list,
946  const cl_event * event_wait_list,
947  cl_event * event,
948  cl_int * errcode_ret),
949  (command_queue, image, blocking_map, map_flags, origin, region,
950  image_row_pitch, image_slice_pitch, num_events_in_wait_list,
951  event_wait_list, event, errcode_ret))
952 */
953
954 /*
955 OCL_FUNC(cl_int, clRetainProgram, (cl_program program), (program))
956
957 OCL_FUNC(cl_int, clGetKernelInfo,
958  (cl_kernel kernel,
959  cl_kernel_info param_name,
960  size_t param_value_size,
961  void * param_value,
962  size_t * param_value_size_ret),
963  (kernel, param_name, param_value_size, param_value, param_value_size_ret))
964
965 */
966
967 OCL_FUNC(cl_int, clRetainMemObject, (cl_mem memobj), (memobj))
968
969 OCL_FUNC(cl_int, clReleaseMemObject, (cl_mem memobj), (memobj))
970
971 /*
972 OCL_FUNC_P(cl_program, clCreateProgramWithSource,
973     (cl_context context,
974     cl_uint count,
975     const char ** strings,
976     const size_t * lengths,
977     cl_int * errcode_ret),
978     (context, count, strings, lengths, errcode_ret))
979
980 OCL_FUNC_P(cl_program, clCreateProgramWithBinary,
981     (cl_context context,
982     cl_uint num_devices,
983     const cl_device_id * device_list,
984     const size_t * lengths,
985     const unsigned char ** binaries,
986     cl_int * binary_status,
987     cl_int * errcode_ret),
988     (context, num_devices, device_list, lengths, binaries, binary_status, errcode_ret))
989
990 OCL_FUNC(cl_int, clReleaseProgram, (cl_program program), (program))
991
992 OCL_FUNC(cl_int, clBuildProgram,
993     (cl_program program,
994     cl_uint num_devices,
995     const cl_device_id * device_list,
996     const char * options,
997     void (CL_CALLBACK * pfn_notify)(cl_program, void *),
998     void * user_data),
999     (program, num_devices, device_list, options, pfn_notify, user_data))
1000
1001 OCL_FUNC(cl_int, clGetProgramInfo,
1002     (cl_program program,
1003     cl_program_info param_name,
1004     size_t param_value_size,
1005     void * param_value,
1006     size_t * param_value_size_ret),
1007     (program, param_name, param_value_size, param_value, param_value_size_ret))
1008
1009 OCL_FUNC(cl_int, clGetProgramBuildInfo,
1010     (cl_program program,
1011     cl_device_id device,
1012     cl_program_build_info param_name,
1013     size_t param_value_size,
1014     void * param_value,
1015     size_t * param_value_size_ret),
1016     (program, device, param_name, param_value_size, param_value, param_value_size_ret))
1017 */
1018 OCL_FUNC_P(cl_kernel, clCreateKernel,
1019     (cl_program program,
1020     const char * kernel_name,
1021     cl_int * errcode_ret),
1022     (program, kernel_name, errcode_ret))
1023
1024 OCL_FUNC(cl_int, clReleaseKernel, (cl_kernel kernel), (kernel))
1025
1026 OCL_FUNC(cl_int, clSetKernelArg,
1027     (cl_kernel kernel,
1028     cl_uint arg_index,
1029     size_t arg_size,
1030     const void * arg_value),
1031     (kernel, arg_index, arg_size, arg_value))
1032
1033 OCL_FUNC(cl_int, clGetKernelWorkGroupInfo,
1034     (cl_kernel kernel,
1035     cl_device_id device,
1036     cl_kernel_work_group_info param_name,
1037     size_t param_value_size,
1038     void * param_value,
1039     size_t * param_value_size_ret),
1040     (kernel, device, param_name, param_value_size, param_value, param_value_size_ret))
1041
1042 OCL_FUNC(cl_int, clFinish, (cl_command_queue command_queue), (command_queue))
1043
1044 OCL_FUNC(cl_int, clEnqueueReadBuffer,
1045     (cl_command_queue command_queue,
1046     cl_mem buffer,
1047     cl_bool blocking_read,
1048     size_t offset,
1049     size_t size,
1050     void * ptr,
1051     cl_uint num_events_in_wait_list,
1052     const cl_event * event_wait_list,
1053     cl_event * event),
1054     (command_queue, buffer, blocking_read, offset, size, ptr,
1055     num_events_in_wait_list, event_wait_list, event))
1056
1057 OCL_FUNC(cl_int, clEnqueueReadBufferRect,
1058     (cl_command_queue command_queue,
1059     cl_mem buffer,
1060     cl_bool blocking_read,
1061     const size_t * buffer_offset,
1062     const size_t * host_offset,
1063     const size_t * region,
1064     size_t buffer_row_pitch,
1065     size_t buffer_slice_pitch,
1066     size_t host_row_pitch,
1067     size_t host_slice_pitch,
1068     void * ptr,
1069     cl_uint num_events_in_wait_list,
1070     const cl_event * event_wait_list,
1071     cl_event * event),
1072     (command_queue, buffer, blocking_read, buffer_offset, host_offset, region, buffer_row_pitch,
1073     buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, num_events_in_wait_list,
1074     event_wait_list, event))
1075
1076 OCL_FUNC(cl_int, clEnqueueWriteBuffer,
1077     (cl_command_queue command_queue,
1078     cl_mem buffer,
1079     cl_bool blocking_write,
1080     size_t offset,
1081     size_t size,
1082     const void * ptr,
1083     cl_uint num_events_in_wait_list,
1084     const cl_event * event_wait_list,
1085     cl_event * event),
1086     (command_queue, buffer, blocking_write, offset, size, ptr,
1087     num_events_in_wait_list, event_wait_list, event))
1088
1089 OCL_FUNC(cl_int, clEnqueueWriteBufferRect,
1090     (cl_command_queue command_queue,
1091     cl_mem buffer,
1092     cl_bool blocking_write,
1093     const size_t * buffer_offset,
1094     const size_t * host_offset,
1095     const size_t * region,
1096     size_t buffer_row_pitch,
1097     size_t buffer_slice_pitch,
1098     size_t host_row_pitch,
1099     size_t host_slice_pitch,
1100     const void * ptr,
1101     cl_uint num_events_in_wait_list,
1102     const cl_event * event_wait_list,
1103     cl_event * event),
1104     (command_queue, buffer, blocking_write, buffer_offset, host_offset,
1105     region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch,
1106     host_slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event))
1107
1108 /*OCL_FUNC(cl_int, clEnqueueFillBuffer,
1109     (cl_command_queue command_queue,
1110     cl_mem buffer,
1111     const void * pattern,
1112     size_t pattern_size,
1113     size_t offset,
1114     size_t size,
1115     cl_uint num_events_in_wait_list,
1116     const cl_event * event_wait_list,
1117     cl_event * event),
1118     (command_queue, buffer, pattern, pattern_size, offset, size,
1119     num_events_in_wait_list, event_wait_list, event))*/
1120
1121 OCL_FUNC(cl_int, clEnqueueCopyBuffer,
1122     (cl_command_queue command_queue,
1123     cl_mem src_buffer,
1124     cl_mem dst_buffer,
1125     size_t src_offset,
1126     size_t dst_offset,
1127     size_t size,
1128     cl_uint num_events_in_wait_list,
1129     const cl_event * event_wait_list,
1130     cl_event * event),
1131     (command_queue, src_buffer, dst_buffer, src_offset, dst_offset,
1132     size, num_events_in_wait_list, event_wait_list, event))
1133
1134 OCL_FUNC(cl_int, clEnqueueCopyBufferRect,
1135     (cl_command_queue command_queue,
1136     cl_mem src_buffer,
1137     cl_mem dst_buffer,
1138     const size_t * src_origin,
1139     const size_t * dst_origin,
1140     const size_t * region,
1141     size_t src_row_pitch,
1142     size_t src_slice_pitch,
1143     size_t dst_row_pitch,
1144     size_t dst_slice_pitch,
1145     cl_uint num_events_in_wait_list,
1146     const cl_event * event_wait_list,
1147     cl_event * event),
1148     (command_queue, src_buffer, dst_buffer, src_origin, dst_origin,
1149     region, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch,
1150     num_events_in_wait_list, event_wait_list, event))
1151
1152 OCL_FUNC_P(void*, clEnqueueMapBuffer,
1153     (cl_command_queue command_queue,
1154     cl_mem buffer,
1155     cl_bool blocking_map,
1156     cl_map_flags map_flags,
1157     size_t offset,
1158     size_t size,
1159     cl_uint num_events_in_wait_list,
1160     const cl_event * event_wait_list,
1161     cl_event * event,
1162     cl_int * errcode_ret),
1163     (command_queue, buffer, blocking_map, map_flags, offset, size,
1164     num_events_in_wait_list, event_wait_list, event, errcode_ret))
1165
1166 OCL_FUNC(cl_int, clEnqueueUnmapMemObject,
1167     (cl_command_queue command_queue,
1168     cl_mem memobj,
1169     void * mapped_ptr,
1170     cl_uint num_events_in_wait_list,
1171     const cl_event * event_wait_list,
1172     cl_event * event),
1173     (command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event))
1174
1175 OCL_FUNC(cl_int, clEnqueueNDRangeKernel,
1176     (cl_command_queue command_queue,
1177     cl_kernel kernel,
1178     cl_uint work_dim,
1179     const size_t * global_work_offset,
1180     const size_t * global_work_size,
1181     const size_t * local_work_size,
1182     cl_uint num_events_in_wait_list,
1183     const cl_event * event_wait_list,
1184     cl_event * event),
1185     (command_queue, kernel, work_dim, global_work_offset, global_work_size,
1186     local_work_size, num_events_in_wait_list, event_wait_list, event))
1187
1188 OCL_FUNC(cl_int, clEnqueueTask,
1189     (cl_command_queue command_queue,
1190     cl_kernel kernel,
1191     cl_uint num_events_in_wait_list,
1192     const cl_event * event_wait_list,
1193     cl_event * event),
1194     (command_queue, kernel, num_events_in_wait_list, event_wait_list, event))
1195
1196 OCL_FUNC(cl_int, clSetEventCallback,
1197     (cl_event event,
1198     cl_int command_exec_callback_type ,
1199     void (CL_CALLBACK  *pfn_event_notify) (cl_event event, cl_int event_command_exec_status, void *user_data),
1200     void *user_data),
1201     (event, command_exec_callback_type, pfn_event_notify, user_data))
1202
1203 OCL_FUNC(cl_int, clReleaseEvent, (cl_event event), (event))
1204
1205 OCL_FUNC(cl_int, clWaitForEvents,
1206     (cl_uint num_events, const cl_event *event_list),
1207     (num_events, event_list))
1208
1209
1210 OCL_FUNC(cl_int, clGetEventProfilingInfo, (
1211     cl_event event,
1212     cl_profiling_info param_name,
1213     size_t param_value_size,
1214     void *param_value,
1215     size_t *param_value_size_ret),
1216     (event, param_name, param_value_size, param_value, param_value_size_ret))
1217
1218 }
1219
1220 #endif
1221
1222 #ifndef CL_VERSION_1_2
1223 #define CL_VERSION_1_2
1224 #endif