collenchyma/frameworks/opencl/api/
ffi.rs

1//! Provides the Foreign Function Interface for OpenCL.
2#![allow(non_camel_case_types, dead_code)]
3#![allow(missing_docs, missing_debug_implementations, missing_copy_implementations)]
4
5use libc;
6use super::types as cl;
7
8#[link(name = "OpenCL")]
9extern
10{
11    /* Platform APIs */
12    pub fn clGetPlatformIDs(
13        num_entries: cl::uint,
14        platforms: *mut cl::platform_id,
15        num_platforms: *mut cl::uint) -> cl::Status;
16
17    pub fn clGetPlatformInfo(
18        platform: cl::platform_id,
19        param_name: cl::platform_info,
20        param_value_size: libc::size_t,
21        param_value: *mut libc::c_void,
22        param_value_size_ret: *mut libc::size_t) -> cl::Status;
23
24
25    /* Device APIs */
26    pub fn clGetDeviceIDs(
27        platform: cl::platform_id,
28        device_type: cl::device_type,
29        num_entries: cl::uint,
30        devices: *mut cl::device_id,
31        num_devices: *mut cl::uint) -> cl::Status;
32
33    pub fn clGetDeviceInfo(
34        device: cl::device_id,
35        param_name: cl::device_info,
36        param_value_size: libc::size_t,
37        param_value: *mut libc::c_void,
38        param_value_size_ret: *mut libc::size_t) -> cl::Status;
39
40    /* Context APIs */
41    pub fn clCreateContext(
42        properties: *const cl::context_properties,
43        num_devices: cl::uint,
44        devices: *const cl::device_id,
45        pfn_notify: extern fn (*const libc::c_char, *const libc::c_void, libc::size_t, *mut libc::c_void),
46        user_data: *mut libc::c_void,
47        errcode_ret: *mut cl::int) -> cl::context_id;
48
49    pub fn clCreateContextFromType(
50        properties: *mut cl::context_properties,
51        device_type: cl::device_type,
52        pfn_notify: extern fn (*mut libc::c_char, *mut libc::c_void, libc::size_t, *mut libc::c_void),
53        user_data: *mut libc::c_void,
54        errcode_ret: *mut cl::int) -> cl::context_id;
55
56    pub fn clRetainContext(context: cl::context_id) -> cl::Status;
57
58    pub fn clReleaseContext(context: cl::context_id) -> cl::Status;
59
60    pub fn clGetContextInfo(
61        context: cl::context_id,
62        param_name: cl::context_info,
63        param_value_size: libc::size_t,
64        param_value: *mut libc::c_void,
65        param_value_size_ret: *mut libc::size_t) -> cl::Status;
66
67    /* Command Queue APIs */
68    pub fn clCreateCommandQueue(
69        context: cl::context_id,
70        device: cl::device_id,
71        properties: cl::command_queue_properties,
72        errcode_ret: *mut cl::int) -> cl::queue_id;
73
74    pub fn clRetainCommandQueue(command_queue: cl::queue_id) -> cl::Status;
75
76    pub fn clReleaseCommandQueue(command_queue: cl::queue_id) -> cl::Status;
77
78    pub fn clGetCommandQueueInfo(
79        command_queue: cl::queue_id,
80        param_name: cl::command_queue_info,
81        param_value_size: libc::size_t,
82        param_value: *mut libc::c_void,
83        param_value_size_ret: *mut libc::size_t) -> cl::Status;
84
85    /* Memory Object APIs */
86    pub fn clCreateBuffer(
87        context: cl::context_id,
88        flags: cl::mem_flags,
89        size: libc::size_t,
90        host_ptr: *mut libc::c_void,
91        errcode_ret: *mut cl::int) -> cl::memory_id;
92
93    pub fn clCreateSubBuffer(
94        buffer: cl::memory_id,
95        flags: cl::mem_flags,
96        buffer_create_type: cl::buffer_create_type,
97        buffer_create_info: *mut libc::c_void,
98        errcode_ret: *mut cl::int) -> cl::memory_id;
99
100    pub fn clCreateImage2D(
101        context: cl::context_id,
102        flags: cl::mem_flags,
103        image_format: *mut cl::image_format,
104        image_width: libc::size_t,
105        image_height: libc::size_t,
106        image_row_pitch: libc::size_t,
107        host_ptr: *mut libc::c_void,
108        errcode_ret: *mut cl::int) -> cl::memory_id;
109
110    pub fn clCreateImage3D(
111        context: cl::context_id,
112        flags: cl::mem_flags,
113        image_format: *mut cl::image_format,
114        image_width: libc::size_t,
115        image_height: libc::size_t,
116        image_depth: libc::size_t,
117        image_row_pitch: libc::size_t,
118        image_depth: libc::size_t,
119        image_row_pitch: libc::size_t,
120        image_slice_pitch: libc::size_t,
121        host_ptr: *mut libc::c_void,
122        errcode_ret: *mut cl::int) -> cl::memory_id;
123
124    pub fn clRetainMemObject(memobj: cl::memory_id) -> cl::Status;
125
126    pub fn clReleaseMemObject(memobj: cl::memory_id) -> cl::Status;
127
128    pub fn clGetSupportedImageFormats(
129        context: cl::context_id,
130        flags: cl::mem_flags,
131        image_type: cl::mem_object_type,
132        num_entries: cl::uint,
133        image_formats: *mut cl::image_format,
134        num_image_formats: *mut cl::uint) -> cl::Status;
135
136    pub fn clGetMemObjectInfo(
137        memobj: cl::memory_id,
138        param_name: cl::mem_info,
139        param_value_size: libc::size_t,
140        param_value: *mut libc::c_void,
141        param_value_size_ret: *mut libc::size_t) -> cl::Status;
142
143    pub fn clGetImageInfo(
144        image: cl::memory_id,
145        param_name: cl::image_info,
146        param_value_size: libc::size_t,
147        param_value: *mut libc::c_void,
148        param_value_size_ret: *mut libc::size_t) -> cl::Status;
149
150    pub fn clSetMemObjectDestructorCallback(
151        memobj: cl::memory_id,
152        pfn_notify: extern fn (cl::memory_id, *mut libc::c_void),
153        user_data: *mut libc::c_void) -> cl::Status;
154
155
156    /*mut * Sampler APIs */
157    pub fn clCreateSampler(
158        context: cl::context_id,
159        normalize_coords: cl::boolean,
160        addressing_mode: cl::addressing_mode,
161        filter_mode: cl::filter_mode,
162        errcode_ret: *mut cl::int) -> cl::sampler;
163
164    pub fn clRetainSampler(sampler: cl::sampler) -> cl::Status;
165
166    pub fn clReleaseSampler(sampler: cl::sampler) ->cl::int;
167
168    pub fn clGetSamplerInfo(
169        sampler: cl::sampler,
170        param_name: cl::sampler_info,
171        param_value_size: libc::size_t,
172        param_value: *mut libc::c_void,
173        param_value_size_ret: *mut libc::size_t) -> cl::Status;
174
175
176    /* Program Object APIs */
177    pub fn clCreateProgramWithSource(
178        context: cl::context_id,
179        count: cl::uint,
180        strings: *const *const libc::c_char,
181        lengths: *const libc::size_t,
182        errcode_ret: *mut cl::int) -> cl::program;
183
184    pub fn clCreateProgramWithBinary(
185        context: cl::context_id,
186        num_devices: cl::uint,
187        device_list: *const cl::device_id,
188        lengths: *const libc::size_t,
189        binaries: *const *const libc::c_uchar,
190        binary_status: *mut cl::int,
191        errcode_ret: *mut cl::int) -> cl::program;
192
193    pub fn clRetainProgram(program: cl::program) -> cl::Status;
194
195    pub fn clReleaseProgram(program: cl::program) -> cl::Status;
196
197    pub fn clBuildProgram(
198        program: cl::program,
199        num_devices: cl::uint,
200        device_list: *const cl::device_id,
201        options: *const libc::c_char,
202        pfn_notify: extern fn (cl::program, *mut libc::c_void),
203        user_data: *mut libc::c_void) -> cl::Status;
204
205    pub fn clUnloadCompiler() -> cl::Status;
206
207    pub fn clGetProgramInfo(
208        program: cl::program,
209        param_name: cl::program_info,
210        param_value_size: libc::size_t,
211        param_value: *mut libc::c_void,
212        param_value_size_ret: *mut libc::size_t) -> cl::Status;
213
214    pub fn clGetProgramBuildInfo(
215        program: cl::program,
216        device: cl::device_id,
217        param_name: cl::program_info,
218        param_value_size: libc::size_t,
219        param_value: *mut libc::c_void,
220        param_value_size_ret: *mut libc::size_t) -> cl::Status;
221
222    /* Kernel Object APIs */
223    pub fn clCreateKernel(
224        program: cl::program,
225        kernel_name: *const libc::c_char,
226        errcode_ret: *mut cl::int) -> cl::kernel_id;
227
228    pub fn clCreateKernelsInProgram(
229        program: cl::program,
230        num_kernels: cl::uint,
231        kernels: *mut cl::kernel_id,
232        num_kernels_ret: *mut cl::uint) -> cl::Status;
233
234    pub fn clRetainKernel(kernel: cl::kernel_id) -> cl::Status;
235
236    pub fn clReleaseKernel(kernel: cl::kernel_id) -> cl::Status;
237
238    pub fn clSetKernelArg(
239        kernel: cl::kernel_id,
240        arg_index: cl::uint,
241        arg_size: libc::size_t,
242        arg_value: *const libc::c_void) -> cl::Status;
243
244    pub fn clGetKernelInfo(
245        kernel: cl::kernel_id,
246        param_name: cl::kernel_info,
247        param_value_size: libc::size_t,
248        param_value: *mut libc::c_void,
249        param_value_size_ret: *mut libc::size_t) -> cl::Status;
250
251    pub fn clGetKernelWorkGroupInfo(
252        kernel: cl::kernel_id,
253        device: cl::device_id,
254        param_name: cl::kernel_work_group_info,
255        param_value_size: libc::size_t,
256        param_value: *mut libc::c_void,
257        param_value_size_ret: *mut libc::size_t) -> cl::Status;
258
259
260    /* Event Object APIs */
261    pub fn clWaitForEvents(
262        num_events: cl::uint,
263        event_list: *const cl::event) -> cl::Status;
264
265    pub fn clGetEventInfo(
266        event: cl::event,
267        param_name: cl::event_info,
268        param_value_size: libc::size_t,
269        param_value: *mut libc::c_void,
270        param_value_size_ret: *mut libc::size_t) -> cl::Status;
271
272    pub fn clCreateUserEvent(
273        context: cl::context_id,
274        errcode_ret: *mut cl::int) -> cl::event;
275
276    pub fn clRetainEvent(event: cl::event) -> cl::Status;
277
278    pub fn clReleaseEvent(event: cl::event) -> cl::Status;
279
280    pub fn clSetUserEventStatus(
281        event: cl::event,
282        execution_status: cl::int) -> cl::Status;
283
284    pub fn clSetEventCallback(
285        event: cl::event,
286        command_exec_callback_type: cl::int,
287        pfn_notify: extern fn (cl::event, cl::int, *mut libc::c_void),
288        user_data: *mut libc::c_void) -> cl::Status;
289
290
291    /* Profiling APIs */
292    pub fn clGetEventProfilingInfo(
293        event: cl::event,
294        param_name: cl::profiling_info,
295        param_value_size: libc::size_t,
296        param_value: *mut libc::c_void,
297        param_value_size_ret: *mut libc::size_t) -> cl::Status;
298
299
300    /* Flush and Finish APIs */
301    pub fn clFlush(command_queue: cl::queue_id) -> cl::Status;
302
303    pub fn clFinish(command_queue: cl::queue_id) -> cl::Status;
304
305    /* Enqueued Commands APIs */
306    pub fn clEnqueueReadBuffer(
307        command_queue: cl::queue_id,
308        buffer: cl::memory_id,
309        blocking_read: cl::boolean,
310        offset: libc::size_t,
311        cb: libc::size_t,
312        ptr: *mut libc::c_void,
313        num_events_in_wait_list: cl::uint,
314        event_wait_list: *const cl::event,
315        event: *mut cl::event) -> cl::Status;
316
317    pub fn clEnqueueReadBufferRect(
318        command_queue: cl::queue_id,
319        buffer: cl::memory_id,
320        blocking_read: cl::boolean,
321        buffer_origin: *mut libc::size_t,
322        host_origin: *mut libc::size_t,
323        region: *mut libc::size_t,
324        buffer_row_pitch: libc::size_t,
325        buffer_slice_pitch: libc::size_t,
326        host_row_pitch: libc::size_t,
327        host_slice_pitch: libc::size_t,
328        ptr: *mut libc::c_void,
329        num_events_in_wait_list: cl::uint,
330        event_wait_list: *const cl::event,
331        event: *mut cl::event) -> cl::Status;
332
333    pub fn clEnqueueWriteBuffer(
334        command_queue: cl::queue_id,
335        buffer: cl::memory_id,
336        blocking_write: cl::boolean,
337        offset: libc::size_t,
338        cb: libc::size_t,
339        ptr: *const libc::c_void,
340        num_events_in_wait_list: cl::uint,
341        event_wait_list: *const cl::event,
342        event: *mut cl::event) -> cl::Status;
343
344    pub fn clEnqueueWriteBufferRect(
345        command_queue: cl::queue_id,
346        blocking_write: cl::boolean,
347        buffer_origin: *mut libc::size_t,
348        host_origin: *mut libc::size_t,
349        region: *mut libc::size_t,
350        buffer_row_pitch: libc::size_t,
351        buffer_slice_pitch: libc::size_t,
352        host_row_pitch: libc::size_t,
353        host_slice_pitch: libc::size_t,
354        ptr: *mut libc::c_void,
355        num_events_in_wait_list: cl::uint,
356        event_wait_list: *const cl::event,
357        event: *mut cl::event) -> cl::Status;
358
359    pub fn clEnqueueCopyBuffer(
360        command_queue: cl::queue_id,
361        src_buffer: cl::memory_id,
362        dst_buffer: cl::memory_id,
363        src_offset: libc::size_t,
364        dst_offset: libc::size_t,
365        cb: libc::size_t,
366        num_events_in_wait_list: cl::uint,
367        event_wait_list: *const cl::event,
368        event: *mut cl::event) -> cl::Status;
369
370    pub fn clEnqueueCopyBufferRect(
371        command_queue: cl::queue_id,
372        src_buffer: cl::memory_id,
373        dst_buffer: cl::memory_id,
374        src_origin: *mut libc::size_t,
375        dst_origin: *mut libc::size_t,
376        region: *mut libc::size_t,
377        src_row_pitch: libc::size_t,
378        src_slice_pitch: libc::size_t,
379        dst_row_pitch: libc::size_t,
380        dst_slice_pitch: libc::size_t,
381        num_events_in_wait_list: cl::uint,
382        event_wait_list: *const cl::event,
383        event: *mut cl::event) -> cl::Status;
384
385    pub fn clEnqueueReadImage(
386        command_queue: cl::queue_id,
387        image: cl::memory_id,
388        blocking_read: cl::boolean,
389        origin: *mut libc::size_t,
390        region: *mut libc::size_t,
391        row_pitch: libc::size_t,
392        slice_pitch: libc::size_t,
393        ptr: *mut libc::c_void,
394        num_events_in_wait_list: cl::uint,
395        event_wait_list: *const cl::event,
396        event: *mut cl::event) -> cl::Status;
397
398    pub fn clEnqueueWriteImage(
399        command_queue: cl::queue_id,
400        image: cl::memory_id,
401        blocking_write: cl::boolean,
402        origin: *mut libc::size_t,
403        region: *mut libc::size_t,
404        input_row_pitch: libc::size_t,
405        input_slice_pitch: libc::size_t,
406        ptr: *mut libc::c_void,
407        num_events_in_wait_list: cl::uint,
408        event_wait_list: *const cl::event,
409        event: *mut cl::event) -> cl::Status;
410
411    pub fn clEnqueueCopyImage(
412        command_queue: cl::queue_id,
413        src_image: cl::memory_id,
414        dst_image: cl::memory_id,
415        src_origin: *mut libc::size_t,
416        dst_origin: *mut libc::size_t,
417        region: *mut libc::size_t,
418        num_events_in_wait_list: cl::uint,
419        event_wait_list: *const cl::event,
420        event: *mut cl::event) -> cl::Status;
421
422    pub fn clEnqueueCopyImageToBuffer(
423        command_queue: cl::queue_id,
424        src_image: cl::memory_id,
425        dst_buffer: cl::memory_id,
426        src_origin: *mut libc::size_t,
427        region: *mut libc::size_t,
428        dst_offset: libc::size_t,
429        num_events_in_wait_list: cl::uint,
430        event_wait_list: *const cl::event,
431        event: *mut cl::event) -> cl::Status;
432
433    pub fn clEnqueueCopyBufferToImage(
434        command_queue: cl::queue_id,
435        src_buffer: cl::memory_id,
436        dst_image: cl::memory_id,
437        src_offset: libc::size_t,
438        dst_origin: *mut libc::size_t,
439        region: *mut libc::size_t,
440        num_events_in_wait_list: cl::uint,
441        event_wait_list: *const cl::event,
442        event: *mut cl::event) -> cl::Status;
443
444    pub fn clEnqueueMapBuffer(
445        command_queue: cl::queue_id,
446        buffer: cl::memory_id,
447        blocking_map: cl::boolean,
448        map_flags: cl::map_flags,
449        offset: libc::size_t,
450        cb: libc::size_t,
451        num_events_in_wait_list: cl::uint,
452        event_wait_list: *const cl::event,
453        event: *mut cl::event,
454        errorcode_ret: *mut cl::int);
455
456    pub fn clEnqueueMapImage(
457        command_queue: cl::queue_id,
458        image: cl::memory_id,
459        blocking_map: cl::boolean,
460        map_flags: cl::map_flags,
461        origin: *mut libc::size_t,
462        region: *mut libc::size_t,
463        image_row_pitch: libc::size_t,
464        image_slice_pitch: libc::size_t,
465        num_events_in_wait_list: cl::uint,
466        event_wait_list: *const cl::event,
467        event: *mut cl::event,
468        errorcode_ret: *mut cl::int);
469
470    pub fn clEnqueueUnmapMemObject(
471        command_queue: cl::queue_id,
472        memobj: cl::memory_id,
473        mapped_ptr: *mut libc::c_void,
474        num_events_in_wait_list: cl::uint,
475        event_wait_list: *const cl::event,
476        event: *mut cl::event) -> cl::Status;
477
478    pub fn clEnqueueNDRangeKernel(
479        command_queue: cl::queue_id,
480        kernel: cl::kernel_id,
481        work_dim: cl::uint,
482        global_work_offset: *const libc::size_t,
483        global_work_size: *const libc::size_t,
484        local_work_size: *const libc::size_t,
485        num_events_in_wait_list: cl::uint,
486        event_wait_list: *const cl::event,
487        event: *mut cl::event) -> cl::Status;
488
489    pub fn clEnqueueTask(
490        command_queue: cl::queue_id,
491        kernel: cl::kernel_id,
492        num_events_in_wait_list: cl::uint,
493        event_wait_list: *const cl::event,
494        event: *mut cl::event) -> cl::Status;
495
496    pub fn clEnqueueNativeKernel(
497        command_queue: cl::queue_id,
498        user_func: extern fn (*mut libc::c_void),
499        args: *mut libc::c_void,
500        cb_args: libc::size_t,
501        num_mem_objects: cl::uint,
502        mem_list: *const cl::memory_id,
503        args_mem_loc: *const *const libc::c_void,
504        num_events_in_wait_list: cl::uint,
505        event_wait_list: *const cl::event,
506        event: *mut cl::event) -> cl::Status;
507
508    pub fn clEnqueueMarker(
509        command_queue: cl::queue_id,
510        event: *mut cl::event) -> cl::Status;
511
512    pub fn clEnqueueWaitForEvents(
513        command_queue: cl::queue_id,
514        num_events: cl::uint,
515        event_list: *mut cl::event) -> cl::Status;
516
517    pub fn clEnqueueBarrier(command_queue: cl::queue_id) -> cl::Status;
518
519    /* Extension function access
520     *
521     * Returns the extension function address for the given function name,
522     * or NULL if a valid function can not be found. The client must
523     * check to make sure the address is not NULL, before using or
524     * or calling the returned function address.
525     */
526    pub fn clGetExtensionFunctionAddress(func_name: *const libc::c_char) -> *mut libc::c_void;
527}