1 /*****************************************************************************
2 * opencl.h: OpenCL structures and defines
3 *****************************************************************************
4 * Copyright (C) 2012-2015 x264 project
6 * Authors: Steve Borho <sborho@multicorewareinc.com>
7 * Anton Mitrofanov <BugMaster@narod.ru>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
23 * This program is also available under a commercial proprietary license.
24 * For more information, contact us at licensing@x264.com.
25 *****************************************************************************/
30 #define CL_USE_DEPRECATED_OPENCL_1_1_APIS
31 #include "extras/cl.h"
33 #define OCL_API(ret, attr, name) typedef ret (attr *name##_func)
36 OCL_API(cl_int, CL_API_CALL, clGetPlatformIDs)
37 ( cl_uint /* num_entries */,
38 cl_platform_id * /* platforms */,
39 cl_uint * /* num_platforms */);
41 OCL_API(cl_int, CL_API_CALL, clGetPlatformInfo)
42 ( cl_platform_id /* platform */,
43 cl_platform_info /* param_name */,
44 size_t /* param_value_size */,
45 void * /* param_value */,
46 size_t * /* param_value_size_ret */);
49 OCL_API(cl_int, CL_API_CALL, clGetDeviceIDs)
50 ( cl_platform_id /* platform */,
51 cl_device_type /* device_type */,
52 cl_uint /* num_entries */,
53 cl_device_id * /* devices */,
54 cl_uint * /* num_devices */);
56 OCL_API(cl_int, CL_API_CALL, clGetDeviceInfo)
57 ( cl_device_id /* device */,
58 cl_device_info /* param_name */,
59 size_t /* param_value_size */,
60 void * /* param_value */,
61 size_t * /* param_value_size_ret */);
63 OCL_API(cl_int, CL_API_CALL, clCreateSubDevices)
64 ( cl_device_id /* in_device */,
65 const cl_device_partition_property * /* properties */,
66 cl_uint /* num_devices */,
67 cl_device_id * /* out_devices */,
68 cl_uint * /* num_devices_ret */);
70 OCL_API(cl_int, CL_API_CALL, clRetainDevice)
71 ( cl_device_id /* device */);
73 OCL_API(cl_int, CL_API_CALL, clReleaseDevice)
74 ( cl_device_id /* device */);
77 OCL_API(cl_context, CL_API_CALL, clCreateContext)
78 ( const cl_context_properties * /* properties */,
79 cl_uint /* num_devices */,
80 const cl_device_id * /* devices */,
81 void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *),
82 void * /* user_data */,
83 cl_int * /* errcode_ret */);
85 OCL_API(cl_context, CL_API_CALL, clCreateContextFromType)
86 ( const cl_context_properties * /* properties */,
87 cl_device_type /* device_type */,
88 void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *),
89 void * /* user_data */,
90 cl_int * /* errcode_ret */);
92 OCL_API(cl_int, CL_API_CALL, clRetainContext)
93 ( cl_context /* context */);
95 OCL_API(cl_int, CL_API_CALL, clReleaseContext)
96 ( cl_context /* context */);
98 OCL_API(cl_int, CL_API_CALL, clGetContextInfo)
99 ( cl_context /* context */,
100 cl_context_info /* param_name */,
101 size_t /* param_value_size */,
102 void * /* param_value */,
103 size_t * /* param_value_size_ret */);
105 /* Command Queue APIs */
106 OCL_API(cl_command_queue, CL_API_CALL, clCreateCommandQueue)
107 ( cl_context /* context */,
108 cl_device_id /* device */,
109 cl_command_queue_properties /* properties */,
110 cl_int * /* errcode_ret */);
112 OCL_API(cl_int, CL_API_CALL, clRetainCommandQueue)
113 ( cl_command_queue /* command_queue */);
115 OCL_API(cl_int, CL_API_CALL, clReleaseCommandQueue)
116 ( cl_command_queue /* command_queue */);
118 OCL_API(cl_int, CL_API_CALL, clGetCommandQueueInfo)
119 ( cl_command_queue /* command_queue */,
120 cl_command_queue_info /* param_name */,
121 size_t /* param_value_size */,
122 void * /* param_value */,
123 size_t * /* param_value_size_ret */);
125 /* Memory Object APIs */
126 OCL_API(cl_mem, CL_API_CALL, clCreateBuffer)
127 ( cl_context /* context */,
128 cl_mem_flags /* flags */,
130 void * /* host_ptr */,
131 cl_int * /* errcode_ret */);
133 OCL_API(cl_mem, CL_API_CALL, clCreateSubBuffer)
134 ( cl_mem /* buffer */,
135 cl_mem_flags /* flags */,
136 cl_buffer_create_type /* buffer_create_type */,
137 const void * /* buffer_create_info */,
138 cl_int * /* errcode_ret */);
140 OCL_API(cl_mem, CL_API_CALL, clCreateImage)
141 ( cl_context /* context */,
142 cl_mem_flags /* flags */,
143 const cl_image_format * /* image_format */,
144 const cl_image_desc * /* image_desc */,
145 void * /* host_ptr */,
146 cl_int * /* errcode_ret */);
148 OCL_API(cl_int, CL_API_CALL, clRetainMemObject)
149 ( cl_mem /* memobj */);
151 OCL_API(cl_int, CL_API_CALL, clReleaseMemObject)
152 ( cl_mem /* memobj */);
154 OCL_API(cl_int, CL_API_CALL, clGetSupportedImageFormats)
155 ( cl_context /* context */,
156 cl_mem_flags /* flags */,
157 cl_mem_object_type /* image_type */,
158 cl_uint /* num_entries */,
159 cl_image_format * /* image_formats */,
160 cl_uint * /* num_image_formats */);
162 OCL_API(cl_int, CL_API_CALL, clGetMemObjectInfo)
163 ( cl_mem /* memobj */,
164 cl_mem_info /* param_name */,
165 size_t /* param_value_size */,
166 void * /* param_value */,
167 size_t * /* param_value_size_ret */);
169 OCL_API(cl_int, CL_API_CALL, clGetImageInfo)
170 ( cl_mem /* image */,
171 cl_image_info /* param_name */,
172 size_t /* param_value_size */,
173 void * /* param_value */,
174 size_t * /* param_value_size_ret */);
176 OCL_API(cl_int, CL_API_CALL, clSetMemObjectDestructorCallback)
177 ( cl_mem /* memobj */,
178 void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/),
179 void * /*user_data */ );
182 OCL_API(cl_sampler, CL_API_CALL, clCreateSampler)
183 ( cl_context /* context */,
184 cl_bool /* normalized_coords */,
185 cl_addressing_mode /* addressing_mode */,
186 cl_filter_mode /* filter_mode */,
187 cl_int * /* errcode_ret */);
189 OCL_API(cl_int, CL_API_CALL, clRetainSampler)
190 ( cl_sampler /* sampler */);
192 OCL_API(cl_int, CL_API_CALL, clReleaseSampler)
193 ( cl_sampler /* sampler */);
195 OCL_API(cl_int, CL_API_CALL, clGetSamplerInfo)
196 ( cl_sampler /* sampler */,
197 cl_sampler_info /* param_name */,
198 size_t /* param_value_size */,
199 void * /* param_value */,
200 size_t * /* param_value_size_ret */);
202 /* Program Object APIs */
203 OCL_API(cl_program, CL_API_CALL, clCreateProgramWithSource)
204 ( cl_context /* context */,
206 const char ** /* strings */,
207 const size_t * /* lengths */,
208 cl_int * /* errcode_ret */);
210 OCL_API(cl_program, CL_API_CALL, clCreateProgramWithBinary)
211 ( cl_context /* context */,
212 cl_uint /* num_devices */,
213 const cl_device_id * /* device_list */,
214 const size_t * /* lengths */,
215 const unsigned char ** /* binaries */,
216 cl_int * /* binary_status */,
217 cl_int * /* errcode_ret */);
219 OCL_API(cl_program, CL_API_CALL, clCreateProgramWithBuiltInKernels)
220 ( cl_context /* context */,
221 cl_uint /* num_devices */,
222 const cl_device_id * /* device_list */,
223 const char * /* kernel_names */,
224 cl_int * /* errcode_ret */);
226 OCL_API(cl_int, CL_API_CALL, clRetainProgram)
227 ( cl_program /* program */);
229 OCL_API(cl_int, CL_API_CALL, clReleaseProgram)
230 ( cl_program /* program */);
232 OCL_API(cl_int, CL_API_CALL, clBuildProgram)
233 ( cl_program /* program */,
234 cl_uint /* num_devices */,
235 const cl_device_id * /* device_list */,
236 const char * /* options */,
237 void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
238 void * /* user_data */);
240 OCL_API(cl_int, CL_API_CALL, clCompileProgram)
241 ( cl_program /* program */,
242 cl_uint /* num_devices */,
243 const cl_device_id * /* device_list */,
244 const char * /* options */,
245 cl_uint /* num_input_headers */,
246 const cl_program * /* input_headers */,
247 const char ** /* header_include_names */,
248 void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
249 void * /* user_data */);
251 OCL_API(cl_program, CL_API_CALL, clLinkProgram)
252 ( cl_context /* context */,
253 cl_uint /* num_devices */,
254 const cl_device_id * /* device_list */,
255 const char * /* options */,
256 cl_uint /* num_input_programs */,
257 const cl_program * /* input_programs */,
258 void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
259 void * /* user_data */,
260 cl_int * /* errcode_ret */ );
263 OCL_API(cl_int, CL_API_CALL, clUnloadPlatformCompiler)
264 ( cl_platform_id /* platform */);
266 OCL_API(cl_int, CL_API_CALL, clGetProgramInfo)
267 ( cl_program /* program */,
268 cl_program_info /* param_name */,
269 size_t /* param_value_size */,
270 void * /* param_value */,
271 size_t * /* param_value_size_ret */);
273 OCL_API(cl_int, CL_API_CALL, clGetProgramBuildInfo)
274 ( cl_program /* program */,
275 cl_device_id /* device */,
276 cl_program_build_info /* param_name */,
277 size_t /* param_value_size */,
278 void * /* param_value */,
279 size_t * /* param_value_size_ret */);
281 /* Kernel Object APIs */
282 OCL_API(cl_kernel, CL_API_CALL, clCreateKernel)
283 ( cl_program /* program */,
284 const char * /* kernel_name */,
285 cl_int * /* errcode_ret */);
287 OCL_API(cl_int, CL_API_CALL, clCreateKernelsInProgram)
288 ( cl_program /* program */,
289 cl_uint /* num_kernels */,
290 cl_kernel * /* kernels */,
291 cl_uint * /* num_kernels_ret */);
293 OCL_API(cl_int, CL_API_CALL, clRetainKernel)
294 ( cl_kernel /* kernel */);
296 OCL_API(cl_int, CL_API_CALL, clReleaseKernel)
297 ( cl_kernel /* kernel */);
299 OCL_API(cl_int, CL_API_CALL, clSetKernelArg)
300 ( cl_kernel /* kernel */,
301 cl_uint /* arg_index */,
302 size_t /* arg_size */,
303 const void * /* arg_value */);
305 OCL_API(cl_int, CL_API_CALL, clGetKernelInfo)
306 ( cl_kernel /* kernel */,
307 cl_kernel_info /* param_name */,
308 size_t /* param_value_size */,
309 void * /* param_value */,
310 size_t * /* param_value_size_ret */);
312 OCL_API(cl_int, CL_API_CALL, clGetKernelArgInfo)
313 ( cl_kernel /* kernel */,
314 cl_uint /* arg_indx */,
315 cl_kernel_arg_info /* param_name */,
316 size_t /* param_value_size */,
317 void * /* param_value */,
318 size_t * /* param_value_size_ret */);
320 OCL_API(cl_int, CL_API_CALL, clGetKernelWorkGroupInfo)
321 ( cl_kernel /* kernel */,
322 cl_device_id /* device */,
323 cl_kernel_work_group_info /* param_name */,
324 size_t /* param_value_size */,
325 void * /* param_value */,
326 size_t * /* param_value_size_ret */);
328 /* Event Object APIs */
329 OCL_API(cl_int, CL_API_CALL, clWaitForEvents)
330 ( cl_uint /* num_events */,
331 const cl_event * /* event_list */);
333 OCL_API(cl_int, CL_API_CALL, clGetEventInfo)
334 ( cl_event /* event */,
335 cl_event_info /* param_name */,
336 size_t /* param_value_size */,
337 void * /* param_value */,
338 size_t * /* param_value_size_ret */);
340 OCL_API(cl_event, CL_API_CALL, clCreateUserEvent)
341 ( cl_context /* context */,
342 cl_int * /* errcode_ret */);
344 OCL_API(cl_int, CL_API_CALL, clRetainEvent)
345 ( cl_event /* event */);
347 OCL_API(cl_int, CL_API_CALL, clReleaseEvent)
348 ( cl_event /* event */);
350 OCL_API(cl_int, CL_API_CALL, clSetUserEventStatus)
351 ( cl_event /* event */,
352 cl_int /* execution_status */);
354 OCL_API(cl_int, CL_API_CALL, clSetEventCallback)
355 ( cl_event /* event */,
356 cl_int /* command_exec_callback_type */,
357 void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *),
358 void * /* user_data */);
361 OCL_API(cl_int, CL_API_CALL, clGetEventProfilingInfo)
362 ( cl_event /* event */,
363 cl_profiling_info /* param_name */,
364 size_t /* param_value_size */,
365 void * /* param_value */,
366 size_t * /* param_value_size_ret */);
368 /* Flush and Finish APIs */
369 OCL_API(cl_int, CL_API_CALL, clFlush)
370 ( cl_command_queue /* command_queue */);
372 OCL_API(cl_int, CL_API_CALL, clFinish)
373 ( cl_command_queue /* command_queue */);
375 /* Enqueued Commands APIs */
376 OCL_API(cl_int, CL_API_CALL, clEnqueueReadBuffer)
377 ( cl_command_queue /* command_queue */,
379 cl_bool /* blocking_read */,
383 cl_uint /* num_events_in_wait_list */,
384 const cl_event * /* event_wait_list */,
385 cl_event * /* event */);
387 OCL_API(cl_int, CL_API_CALL, clEnqueueReadBufferRect)
388 ( cl_command_queue /* command_queue */,
390 cl_bool /* blocking_read */,
391 const size_t * /* buffer_offset */,
392 const size_t * /* host_offset */,
393 const size_t * /* region */,
394 size_t /* buffer_row_pitch */,
395 size_t /* buffer_slice_pitch */,
396 size_t /* host_row_pitch */,
397 size_t /* host_slice_pitch */,
399 cl_uint /* num_events_in_wait_list */,
400 const cl_event * /* event_wait_list */,
401 cl_event * /* event */);
403 OCL_API(cl_int, CL_API_CALL, clEnqueueWriteBuffer)
404 ( cl_command_queue /* command_queue */,
406 cl_bool /* blocking_write */,
409 const void * /* ptr */,
410 cl_uint /* num_events_in_wait_list */,
411 const cl_event * /* event_wait_list */,
412 cl_event * /* event */);
414 OCL_API(cl_int, CL_API_CALL, clEnqueueWriteBufferRect)
415 ( cl_command_queue /* command_queue */,
417 cl_bool /* blocking_write */,
418 const size_t * /* buffer_offset */,
419 const size_t * /* host_offset */,
420 const size_t * /* region */,
421 size_t /* buffer_row_pitch */,
422 size_t /* buffer_slice_pitch */,
423 size_t /* host_row_pitch */,
424 size_t /* host_slice_pitch */,
425 const void * /* ptr */,
426 cl_uint /* num_events_in_wait_list */,
427 const cl_event * /* event_wait_list */,
428 cl_event * /* event */);
430 OCL_API(cl_int, CL_API_CALL, clEnqueueFillBuffer)
431 ( cl_command_queue /* command_queue */,
433 const void * /* pattern */,
434 size_t /* pattern_size */,
437 cl_uint /* num_events_in_wait_list */,
438 const cl_event * /* event_wait_list */,
439 cl_event * /* event */);
441 OCL_API(cl_int, CL_API_CALL, clEnqueueCopyBuffer)
442 ( cl_command_queue /* command_queue */,
443 cl_mem /* src_buffer */,
444 cl_mem /* dst_buffer */,
445 size_t /* src_offset */,
446 size_t /* dst_offset */,
448 cl_uint /* num_events_in_wait_list */,
449 const cl_event * /* event_wait_list */,
450 cl_event * /* event */);
452 OCL_API(cl_int, CL_API_CALL, clEnqueueCopyBufferRect)
453 ( cl_command_queue /* command_queue */,
454 cl_mem /* src_buffer */,
455 cl_mem /* dst_buffer */,
456 const size_t * /* src_origin */,
457 const size_t * /* dst_origin */,
458 const size_t * /* region */,
459 size_t /* src_row_pitch */,
460 size_t /* src_slice_pitch */,
461 size_t /* dst_row_pitch */,
462 size_t /* dst_slice_pitch */,
463 cl_uint /* num_events_in_wait_list */,
464 const cl_event * /* event_wait_list */,
465 cl_event * /* event */);
467 OCL_API(cl_int, CL_API_CALL, clEnqueueReadImage)
468 ( cl_command_queue /* command_queue */,
470 cl_bool /* blocking_read */,
471 const size_t * /* origin[3] */,
472 const size_t * /* region[3] */,
473 size_t /* row_pitch */,
474 size_t /* slice_pitch */,
476 cl_uint /* num_events_in_wait_list */,
477 const cl_event * /* event_wait_list */,
478 cl_event * /* event */);
480 OCL_API(cl_int, CL_API_CALL, clEnqueueWriteImage)
481 ( cl_command_queue /* command_queue */,
483 cl_bool /* blocking_write */,
484 const size_t * /* origin[3] */,
485 const size_t * /* region[3] */,
486 size_t /* input_row_pitch */,
487 size_t /* input_slice_pitch */,
488 const void * /* ptr */,
489 cl_uint /* num_events_in_wait_list */,
490 const cl_event * /* event_wait_list */,
491 cl_event * /* event */);
493 OCL_API(cl_int, CL_API_CALL, clEnqueueFillImage)
494 ( cl_command_queue /* command_queue */,
496 const void * /* fill_color */,
497 const size_t * /* origin[3] */,
498 const size_t * /* region[3] */,
499 cl_uint /* num_events_in_wait_list */,
500 const cl_event * /* event_wait_list */,
501 cl_event * /* event */);
503 OCL_API(cl_int, CL_API_CALL, clEnqueueCopyImage)
504 ( cl_command_queue /* command_queue */,
505 cl_mem /* src_image */,
506 cl_mem /* dst_image */,
507 const size_t * /* src_origin[3] */,
508 const size_t * /* dst_origin[3] */,
509 const size_t * /* region[3] */,
510 cl_uint /* num_events_in_wait_list */,
511 const cl_event * /* event_wait_list */,
512 cl_event * /* event */);
514 OCL_API(cl_int, CL_API_CALL, clEnqueueCopyImageToBuffer)
515 ( cl_command_queue /* command_queue */,
516 cl_mem /* src_image */,
517 cl_mem /* dst_buffer */,
518 const size_t * /* src_origin[3] */,
519 const size_t * /* region[3] */,
520 size_t /* dst_offset */,
521 cl_uint /* num_events_in_wait_list */,
522 const cl_event * /* event_wait_list */,
523 cl_event * /* event */);
525 OCL_API(cl_int, CL_API_CALL, clEnqueueCopyBufferToImage)
526 ( cl_command_queue /* command_queue */,
527 cl_mem /* src_buffer */,
528 cl_mem /* dst_image */,
529 size_t /* src_offset */,
530 const size_t * /* dst_origin[3] */,
531 const size_t * /* region[3] */,
532 cl_uint /* num_events_in_wait_list */,
533 const cl_event * /* event_wait_list */,
534 cl_event * /* event */);
536 OCL_API(void *, CL_API_CALL, clEnqueueMapBuffer)
537 ( cl_command_queue /* command_queue */,
539 cl_bool /* blocking_map */,
540 cl_map_flags /* map_flags */,
543 cl_uint /* num_events_in_wait_list */,
544 const cl_event * /* event_wait_list */,
545 cl_event * /* event */,
546 cl_int * /* errcode_ret */);
548 OCL_API(void *, CL_API_CALL, clEnqueueMapImage)
549 ( cl_command_queue /* command_queue */,
551 cl_bool /* blocking_map */,
552 cl_map_flags /* map_flags */,
553 const size_t * /* origin[3] */,
554 const size_t * /* region[3] */,
555 size_t * /* image_row_pitch */,
556 size_t * /* image_slice_pitch */,
557 cl_uint /* num_events_in_wait_list */,
558 const cl_event * /* event_wait_list */,
559 cl_event * /* event */,
560 cl_int * /* errcode_ret */);
562 OCL_API(cl_int, CL_API_CALL, clEnqueueUnmapMemObject)
563 ( cl_command_queue /* command_queue */,
565 void * /* mapped_ptr */,
566 cl_uint /* num_events_in_wait_list */,
567 const cl_event * /* event_wait_list */,
568 cl_event * /* event */);
570 OCL_API(cl_int, CL_API_CALL, clEnqueueMigrateMemObjects)
571 ( cl_command_queue /* command_queue */,
572 cl_uint /* num_mem_objects */,
573 const cl_mem * /* mem_objects */,
574 cl_mem_migration_flags /* flags */,
575 cl_uint /* num_events_in_wait_list */,
576 const cl_event * /* event_wait_list */,
577 cl_event * /* event */);
579 OCL_API(cl_int, CL_API_CALL, clEnqueueNDRangeKernel)
580 ( cl_command_queue /* command_queue */,
581 cl_kernel /* kernel */,
582 cl_uint /* work_dim */,
583 const size_t * /* global_work_offset */,
584 const size_t * /* global_work_size */,
585 const size_t * /* local_work_size */,
586 cl_uint /* num_events_in_wait_list */,
587 const cl_event * /* event_wait_list */,
588 cl_event * /* event */);
590 OCL_API(cl_int, CL_API_CALL, clEnqueueTask)
591 ( cl_command_queue /* command_queue */,
592 cl_kernel /* kernel */,
593 cl_uint /* num_events_in_wait_list */,
594 const cl_event * /* event_wait_list */,
595 cl_event * /* event */);
597 OCL_API(cl_int, CL_API_CALL, clEnqueueNativeKernel)
598 ( cl_command_queue /* command_queue */,
599 void (CL_CALLBACK * /*user_func*/)(void *),
601 size_t /* cb_args */,
602 cl_uint /* num_mem_objects */,
603 const cl_mem * /* mem_list */,
604 const void ** /* args_mem_loc */,
605 cl_uint /* num_events_in_wait_list */,
606 const cl_event * /* event_wait_list */,
607 cl_event * /* event */);
609 OCL_API(cl_int, CL_API_CALL, clEnqueueMarkerWithWaitList)
610 ( cl_command_queue /* command_queue */,
611 cl_uint /* num_events_in_wait_list */,
612 const cl_event * /* event_wait_list */,
613 cl_event * /* event */);
615 OCL_API(cl_int, CL_API_CALL, clEnqueueBarrierWithWaitList)
616 ( cl_command_queue /* command_queue */,
617 cl_uint /* num_events_in_wait_list */,
618 const cl_event * /* event_wait_list */,
619 cl_event * /* event */);
622 /* Extension function access
624 * Returns the extension function address for the given function name,
625 * or NULL if a valid function can not be found. The client must
626 * check to make sure the address is not NULL, before using or
627 * calling the returned function address.
629 OCL_API(void *, CL_API_CALL, clGetExtensionFunctionAddressForPlatform)
630 ( cl_platform_id /* platform */,
631 const char * /* func_name */);
634 // Deprecated OpenCL 1.1 APIs
635 OCL_API(cl_mem, CL_API_CALL, clCreateImage2D)
636 ( cl_context /* context */,
637 cl_mem_flags /* flags */,
638 const cl_image_format * /* image_format */,
639 size_t /* image_width */,
640 size_t /* image_height */,
641 size_t /* image_row_pitch */,
642 void * /* host_ptr */,
643 cl_int * /* errcode_ret */);
645 OCL_API(cl_mem, CL_API_CALL, clCreateImage3D)
646 ( cl_context /* context */,
647 cl_mem_flags /* flags */,
648 const cl_image_format * /* image_format */,
649 size_t /* image_width */,
650 size_t /* image_height */,
651 size_t /* image_depth */,
652 size_t /* image_row_pitch */,
653 size_t /* image_slice_pitch */,
654 void * /* host_ptr */,
655 cl_int * /* errcode_ret */);
657 OCL_API(cl_int, CL_API_CALL, clEnqueueMarker)
658 ( cl_command_queue /* command_queue */,
659 cl_event * /* event */);
661 OCL_API(cl_int, CL_API_CALL, clEnqueueWaitForEvents)
662 ( cl_command_queue /* command_queue */,
663 cl_uint /* num_events */,
664 const cl_event * /* event_list */);
666 OCL_API(cl_int, CL_API_CALL, clEnqueueBarrier)
667 ( cl_command_queue /* command_queue */);
669 OCL_API(cl_int, CL_API_CALL, clUnloadCompiler)
672 OCL_API(void *, CL_API_CALL, clGetExtensionFunctionAddress)
673 ( const char * /* func_name */);
675 #define OCL_DECLARE_FUNC(name) name##_func name
681 OCL_DECLARE_FUNC( clBuildProgram );
682 OCL_DECLARE_FUNC( clCreateBuffer );
683 OCL_DECLARE_FUNC( clCreateCommandQueue );
684 OCL_DECLARE_FUNC( clCreateContext );
685 OCL_DECLARE_FUNC( clCreateImage2D );
686 OCL_DECLARE_FUNC( clCreateKernel );
687 OCL_DECLARE_FUNC( clCreateProgramWithBinary );
688 OCL_DECLARE_FUNC( clCreateProgramWithSource );
689 OCL_DECLARE_FUNC( clEnqueueCopyBuffer );
690 OCL_DECLARE_FUNC( clEnqueueMapBuffer );
691 OCL_DECLARE_FUNC( clEnqueueNDRangeKernel );
692 OCL_DECLARE_FUNC( clEnqueueReadBuffer );
693 OCL_DECLARE_FUNC( clEnqueueWriteBuffer );
694 OCL_DECLARE_FUNC( clFinish );
695 OCL_DECLARE_FUNC( clGetCommandQueueInfo );
696 OCL_DECLARE_FUNC( clGetDeviceIDs );
697 OCL_DECLARE_FUNC( clGetDeviceInfo );
698 OCL_DECLARE_FUNC( clGetKernelWorkGroupInfo );
699 OCL_DECLARE_FUNC( clGetPlatformIDs );
700 OCL_DECLARE_FUNC( clGetProgramBuildInfo );
701 OCL_DECLARE_FUNC( clGetProgramInfo );
702 OCL_DECLARE_FUNC( clGetSupportedImageFormats );
703 OCL_DECLARE_FUNC( clReleaseCommandQueue );
704 OCL_DECLARE_FUNC( clReleaseContext );
705 OCL_DECLARE_FUNC( clReleaseKernel );
706 OCL_DECLARE_FUNC( clReleaseMemObject );
707 OCL_DECLARE_FUNC( clReleaseProgram );
708 OCL_DECLARE_FUNC( clSetKernelArg );
709 } x264_opencl_function_t;
711 /* Number of downscale resolutions to use for motion search */
712 #define NUM_IMAGE_SCALES 4
714 /* Number of PCIe copies that can be queued before requiring a flush */
715 #define MAX_FINISH_COPIES 1024
717 /* Size (in bytes) of the page-locked buffer used for PCIe xfers */
718 #define PAGE_LOCKED_BUF_SIZE 32 * 1024 * 1024
722 x264_opencl_function_t *ocl;
726 cl_command_queue queue;
728 cl_program lookahead_program;
731 cl_mem page_locked_buffer;
732 char *page_locked_ptr;
740 } copies[MAX_FINISH_COPIES];
745 int lookahead_thread_pri;
746 int opencl_thread_pri;
748 /* downscale lowres luma */
749 cl_kernel downscale_hpel_kernel;
750 cl_kernel downscale_kernel1;
751 cl_kernel downscale_kernel2;
752 cl_mem luma_16x16_image[2];
754 /* weightp filtering */
755 cl_kernel weightp_hpel_kernel;
756 cl_kernel weightp_scaled_images_kernel;
757 cl_mem weighted_scaled_images[NUM_IMAGE_SCALES];
758 cl_mem weighted_luma_hpel;
761 cl_kernel memset_kernel;
762 cl_kernel intra_kernel;
763 cl_kernel rowsum_intra_kernel;
766 /* hierarchical motion estimation */
767 cl_kernel hme_kernel;
768 cl_kernel subpel_refine_kernel;
769 cl_mem mv_buffers[2];
770 cl_mem lowres_mv_costs;
774 cl_kernel mode_select_kernel;
775 cl_kernel rowsum_inter_kernel;
776 cl_mem lowres_costs[2];
777 cl_mem frame_stats[2]; /* cost_est, cost_est_aq, intra_mbs */
782 x264_opencl_function_t *ocl;
784 cl_mem scaled_image2Ds[NUM_IMAGE_SCALES];
786 cl_mem inv_qscale_factor;
790 cl_mem lowres_mv_costs0;
791 cl_mem lowres_mv_costs1;
792 } x264_frame_opencl_t;
794 typedef struct x264_frame x264_frame;
796 x264_opencl_function_t *x264_opencl_load_library( void );
797 void x264_opencl_close_library( x264_opencl_function_t *ocl );
799 int x264_opencl_lookahead_init( x264_t *h );
800 void x264_opencl_lookahead_delete( x264_t *h );
802 void x264_opencl_frame_delete( x264_frame *frame );