blob: 6725f36a5dea3c5a5d2b0ab1ea5af327c811a710 [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
Gian Marco85e6f512018-02-01 16:57:48 +00002 * Copyright (c) 2017-2018 ARM Limited.
Anthony Barbier6ff3b192017-09-04 18:44:23 +01003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24
25#include "arm_compute/core/CL/OpenCL.h"
26
27#include <dlfcn.h>
28#include <iostream>
29
Moritz Pflanzer725788e2017-07-07 15:35:56 +010030namespace arm_compute
Anthony Barbier6ff3b192017-09-04 18:44:23 +010031{
Moritz Pflanzer725788e2017-07-07 15:35:56 +010032CLSymbols &CLSymbols::get()
33{
34 static CLSymbols symbols;
35 return symbols;
36}
37
38bool CLSymbols::load_default()
39{
40 static const std::vector<std::string> libraries{ "libOpenCL.so", "libGLES_mali.so", "libmali.so" };
41
42 if(_loaded.first)
Anthony Barbier6ff3b192017-09-04 18:44:23 +010043 {
Moritz Pflanzer725788e2017-07-07 15:35:56 +010044 return _loaded.second;
45 }
46
47 // Indicate that default loading has been tried
48 _loaded.first = true;
49
50 for(const auto &lib : libraries)
51 {
52 if(load(lib))
Anthony Barbier6ff3b192017-09-04 18:44:23 +010053 {
Moritz Pflanzer725788e2017-07-07 15:35:56 +010054 return true;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010055 }
56 }
57
Moritz Pflanzer725788e2017-07-07 15:35:56 +010058 std::cerr << "Couldn't find any OpenCL library.\n";
59 return false;
60}
61
62bool CLSymbols::load(const std::string &library)
63{
64 void *handle = dlopen(library.c_str(), RTLD_LAZY | RTLD_LOCAL);
65
66 if(handle == nullptr)
Anthony Barbier6ff3b192017-09-04 18:44:23 +010067 {
Moritz Pflanzer725788e2017-07-07 15:35:56 +010068 std::cerr << "Can't load " << library << ": " << dlerror() << "\n";
69 // Set status of loading to failed
70 _loaded.second = false;
71 return false;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010072 }
73
Anthony Barbier58c4ff12017-11-09 09:15:32 +000074#define LOAD_FUNCTION_PTR(func_name, handle) \
75 func_name##_ptr = reinterpret_cast<decltype(func_name) *>(dlsym(handle, #func_name));
76
Anthony Barbierb6eb3532018-08-08 13:20:04 +010077 LOAD_FUNCTION_PTR(clCreateContext, handle);
Anthony Barbiera9e15332017-12-22 16:37:30 +000078 LOAD_FUNCTION_PTR(clCreateContextFromType, handle);
79 LOAD_FUNCTION_PTR(clCreateCommandQueue, handle);
80 LOAD_FUNCTION_PTR(clGetContextInfo, handle);
Anthony Barbier58c4ff12017-11-09 09:15:32 +000081 LOAD_FUNCTION_PTR(clBuildProgram, handle);
82 LOAD_FUNCTION_PTR(clEnqueueNDRangeKernel, handle);
83 LOAD_FUNCTION_PTR(clSetKernelArg, handle);
84 LOAD_FUNCTION_PTR(clReleaseKernel, handle);
85 LOAD_FUNCTION_PTR(clCreateProgramWithSource, handle);
86 LOAD_FUNCTION_PTR(clCreateBuffer, handle);
87 LOAD_FUNCTION_PTR(clRetainKernel, handle);
88 LOAD_FUNCTION_PTR(clCreateKernel, handle);
89 LOAD_FUNCTION_PTR(clGetProgramInfo, handle);
90 LOAD_FUNCTION_PTR(clFlush, handle);
91 LOAD_FUNCTION_PTR(clFinish, handle);
92 LOAD_FUNCTION_PTR(clReleaseProgram, handle);
93 LOAD_FUNCTION_PTR(clRetainContext, handle);
94 LOAD_FUNCTION_PTR(clCreateProgramWithBinary, handle);
95 LOAD_FUNCTION_PTR(clReleaseCommandQueue, handle);
96 LOAD_FUNCTION_PTR(clEnqueueMapBuffer, handle);
97 LOAD_FUNCTION_PTR(clRetainProgram, handle);
98 LOAD_FUNCTION_PTR(clGetProgramBuildInfo, handle);
99 LOAD_FUNCTION_PTR(clEnqueueReadBuffer, handle);
100 LOAD_FUNCTION_PTR(clEnqueueWriteBuffer, handle);
101 LOAD_FUNCTION_PTR(clReleaseEvent, handle);
102 LOAD_FUNCTION_PTR(clReleaseContext, handle);
103 LOAD_FUNCTION_PTR(clRetainCommandQueue, handle);
104 LOAD_FUNCTION_PTR(clEnqueueUnmapMemObject, handle);
105 LOAD_FUNCTION_PTR(clRetainMemObject, handle);
106 LOAD_FUNCTION_PTR(clReleaseMemObject, handle);
107 LOAD_FUNCTION_PTR(clGetDeviceInfo, handle);
108 LOAD_FUNCTION_PTR(clGetDeviceIDs, handle);
Georgios Pinitasdf310362018-11-14 13:16:56 +0000109 LOAD_FUNCTION_PTR(clGetMemObjectInfo, handle);
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000110 LOAD_FUNCTION_PTR(clRetainEvent, handle);
111 LOAD_FUNCTION_PTR(clGetPlatformIDs, handle);
112 LOAD_FUNCTION_PTR(clGetKernelWorkGroupInfo, handle);
Gian Marco85e6f512018-02-01 16:57:48 +0000113 LOAD_FUNCTION_PTR(clGetCommandQueueInfo, handle);
114 LOAD_FUNCTION_PTR(clGetKernelInfo, handle);
115 LOAD_FUNCTION_PTR(clGetEventProfilingInfo, handle);
Pablo Telloe86a09f2018-01-11 15:44:48 +0000116 LOAD_FUNCTION_PTR(clSVMAlloc, handle);
117 LOAD_FUNCTION_PTR(clSVMFree, handle);
118 LOAD_FUNCTION_PTR(clEnqueueSVMMap, handle);
119 LOAD_FUNCTION_PTR(clEnqueueSVMUnmap, handle);
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100120 LOAD_FUNCTION_PTR(clEnqueueMarker, handle);
121 LOAD_FUNCTION_PTR(clWaitForEvents, handle);
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000122
123#undef LOAD_FUNCTION_PTR
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100124
Anthony Barbier7b43d312017-12-14 10:58:47 +0000125 //Don't call dlclose(handle) or all the symbols will be unloaded !
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100126
127 // Disable default loading and set status to successful
128 _loaded = std::make_pair(true, true);
129
130 return true;
131}
132
133bool opencl_is_available()
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100134{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100135 CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000136 return CLSymbols::get().clBuildProgram_ptr != nullptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100137}
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100138} // namespace arm_compute
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100139
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100140cl_int clEnqueueMarker(cl_command_queue command_queue,
141 cl_event *event)
142{
143 arm_compute::CLSymbols::get().load_default();
144 auto func = arm_compute::CLSymbols::get().clEnqueueMarker_ptr;
145 if(func != nullptr)
146 {
147 return func(command_queue, event);
148 }
149 else
150 {
151 return CL_OUT_OF_RESOURCES;
152 }
153}
154
155cl_int clWaitForEvents(cl_uint num_events,
156 const cl_event *event_list)
157{
158 arm_compute::CLSymbols::get().load_default();
159 auto func = arm_compute::CLSymbols::get().clWaitForEvents_ptr;
160 if(func != nullptr)
161 {
162 return func(num_events, event_list);
163 }
164 else
165 {
166 return CL_OUT_OF_RESOURCES;
167 }
168}
169
Pablo Telloe86a09f2018-01-11 15:44:48 +0000170cl_int clEnqueueSVMMap(cl_command_queue command_queue, cl_bool blocking_map, cl_map_flags flags, void *svm_ptr,
171 size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
172{
173 arm_compute::CLSymbols::get().load_default();
174 auto func = arm_compute::CLSymbols::get().clEnqueueSVMMap_ptr;
175 if(func != nullptr)
176 {
177 return func(command_queue, blocking_map, flags, svm_ptr, size, num_events_in_wait_list, event_wait_list, event);
178 }
179 else
180 {
181 return CL_OUT_OF_RESOURCES;
182 }
183}
184
185cl_int clEnqueueSVMUnmap(cl_command_queue command_queue, void *svm_ptr, cl_uint num_events_in_wait_list,
186 const cl_event *event_wait_list, cl_event *event)
187{
188 arm_compute::CLSymbols::get().load_default();
189 auto func = arm_compute::CLSymbols::get().clEnqueueSVMUnmap_ptr;
190 if(func != nullptr)
191 {
192 return func(command_queue, svm_ptr, num_events_in_wait_list, event_wait_list, event);
193 }
194 else
195 {
196 return CL_OUT_OF_RESOURCES;
197 }
198}
199
200void *clSVMAlloc(cl_context context, cl_svm_mem_flags_arm flags, size_t size, cl_uint alignment)
201{
202 arm_compute::CLSymbols::get().load_default();
203 auto func = arm_compute::CLSymbols::get().clSVMAlloc_ptr;
204 if(func != nullptr)
205 {
206 return func(context, flags, size, alignment);
207 }
208 else
209 {
210 return nullptr;
211 }
212}
213
214void clSVMFree(cl_context context, void *svm_pointer)
215{
216 arm_compute::CLSymbols::get().load_default();
217 auto func = arm_compute::CLSymbols::get().clSVMFree_ptr;
218 if(func != nullptr)
219 {
220 func(context, svm_pointer);
221 }
222}
223
Anthony Barbiera9e15332017-12-22 16:37:30 +0000224cl_int clGetContextInfo(cl_context context,
225 cl_context_info param_name,
226 size_t param_value_size,
227 void *param_value,
228 size_t *param_value_size_ret)
229{
230 arm_compute::CLSymbols::get().load_default();
231 auto func = arm_compute::CLSymbols::get().clGetContextInfo_ptr;
232 if(func != nullptr)
233 {
234 return func(context, param_name, param_value_size, param_value, param_value_size_ret);
235 }
236 else
237 {
238 return CL_OUT_OF_RESOURCES;
239 }
240}
241
242cl_command_queue clCreateCommandQueue(cl_context context,
243 cl_device_id device,
244 cl_command_queue_properties properties,
245 cl_int *errcode_ret)
246{
247 arm_compute::CLSymbols::get().load_default();
248 auto func = arm_compute::CLSymbols::get().clCreateCommandQueue_ptr;
249 if(func != nullptr)
250 {
251 return func(context, device, properties, errcode_ret);
252 }
253 else
254 {
255 return nullptr;
256 }
257}
258
Anthony Barbierb6eb3532018-08-08 13:20:04 +0100259cl_context clCreateContext(
260 const cl_context_properties *properties,
261 cl_uint num_devices,
262 const cl_device_id *devices,
263 void (*pfn_notify)(const char *, const void *, size_t, void *),
264 void *user_data,
265 cl_int *errcode_ret)
266{
267 arm_compute::CLSymbols::get().load_default();
268 auto func = arm_compute::CLSymbols::get().clCreateContext_ptr;
269 if(func != nullptr)
270 {
271 return func(properties, num_devices, devices, pfn_notify, user_data, errcode_ret);
272 }
273 else
274 {
275 return nullptr;
276 }
277}
278
Anthony Barbiera9e15332017-12-22 16:37:30 +0000279cl_context clCreateContextFromType(const cl_context_properties *properties,
280 cl_device_type device_type,
281 void (*pfn_notify)(const char *, const void *, size_t, void *),
282 void *user_data,
283 cl_int *errcode_ret)
284{
285 arm_compute::CLSymbols::get().load_default();
286 auto func = arm_compute::CLSymbols::get().clCreateContextFromType_ptr;
287 if(func != nullptr)
288 {
289 return func(properties, device_type, pfn_notify, user_data, errcode_ret);
290 }
291 else
292 {
293 return nullptr;
294 }
295}
296
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100297cl_int clBuildProgram(
298 cl_program program,
299 cl_uint num_devices,
300 const cl_device_id *device_list,
301 const char *options,
302 void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
303 void *user_data)
304{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100305 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000306 auto func = arm_compute::CLSymbols::get().clBuildProgram_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100307 if(func != nullptr)
308 {
309 return func(program, num_devices, device_list, options, pfn_notify, user_data);
310 }
311 else
312 {
313 return CL_OUT_OF_RESOURCES;
314 }
315}
316
317cl_int clEnqueueNDRangeKernel(
318 cl_command_queue command_queue,
319 cl_kernel kernel,
320 cl_uint work_dim,
321 const size_t *global_work_offset,
322 const size_t *global_work_size,
323 const size_t *local_work_size,
324 cl_uint num_events_in_wait_list,
325 const cl_event *event_wait_list,
326 cl_event *event)
327{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100328 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000329 auto func = arm_compute::CLSymbols::get().clEnqueueNDRangeKernel_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100330 if(func != nullptr)
331 {
332 return func(command_queue, kernel, work_dim, global_work_offset, global_work_size, local_work_size, num_events_in_wait_list, event_wait_list, event);
333 }
334 else
335 {
336 return CL_OUT_OF_RESOURCES;
337 }
338}
339
340cl_int clSetKernelArg(
341 cl_kernel kernel,
342 cl_uint arg_index,
343 size_t arg_size,
344 const void *arg_value)
345{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100346 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000347 auto func = arm_compute::CLSymbols::get().clSetKernelArg_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100348 if(func != nullptr)
349 {
350 return func(kernel, arg_index, arg_size, arg_value);
351 }
352 else
353 {
354 return CL_OUT_OF_RESOURCES;
355 }
356}
357
Georgios Pinitasbaf174e2017-09-08 19:47:30 +0100358cl_int clRetainMemObject(cl_mem memobj)
359{
360 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000361 auto func = arm_compute::CLSymbols::get().clRetainMemObject_ptr;
Georgios Pinitasbaf174e2017-09-08 19:47:30 +0100362 if(func != nullptr)
363 {
364 return func(memobj);
365 }
366 else
367 {
368 return CL_OUT_OF_RESOURCES;
369 }
370}
371
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100372cl_int clReleaseMemObject(cl_mem memobj)
373{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100374 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000375 auto func = arm_compute::CLSymbols::get().clReleaseMemObject_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100376 if(func != nullptr)
377 {
378 return func(memobj);
379 }
380 else
381 {
382 return CL_OUT_OF_RESOURCES;
383 }
384}
385
386cl_int clEnqueueUnmapMemObject(
387 cl_command_queue command_queue,
388 cl_mem memobj,
389 void *mapped_ptr,
390 cl_uint num_events_in_wait_list,
391 const cl_event *event_wait_list,
392 cl_event *event)
393{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100394 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000395 auto func = arm_compute::CLSymbols::get().clEnqueueUnmapMemObject_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100396 if(func != nullptr)
397 {
398 return func(command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
399 }
400 else
401 {
402 return CL_OUT_OF_RESOURCES;
403 }
404}
405
406cl_int clRetainCommandQueue(cl_command_queue command_queue)
407{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100408 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000409 auto func = arm_compute::CLSymbols::get().clRetainCommandQueue_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100410 if(func != nullptr)
411 {
412 return func(command_queue);
413 }
414 else
415 {
416 return CL_OUT_OF_RESOURCES;
417 }
418}
419
420cl_int clReleaseContext(cl_context context)
421{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100422 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000423 auto func = arm_compute::CLSymbols::get().clReleaseContext_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100424 if(func != nullptr)
425 {
426 return func(context);
427 }
428 else
429 {
430 return CL_OUT_OF_RESOURCES;
431 }
432}
433cl_int clReleaseEvent(cl_event event)
434{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100435 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000436 auto func = arm_compute::CLSymbols::get().clReleaseEvent_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100437 if(func != nullptr)
438 {
439 return func(event);
440 }
441 else
442 {
443 return CL_OUT_OF_RESOURCES;
444 }
445}
446
447cl_int clEnqueueWriteBuffer(
448 cl_command_queue command_queue,
449 cl_mem buffer,
450 cl_bool blocking_write,
451 size_t offset,
452 size_t size,
453 const void *ptr,
454 cl_uint num_events_in_wait_list,
455 const cl_event *event_wait_list,
456 cl_event *event)
457{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100458 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000459 auto func = arm_compute::CLSymbols::get().clEnqueueWriteBuffer_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100460 if(func != nullptr)
461 {
462 return func(command_queue, buffer, blocking_write, offset, size, ptr, num_events_in_wait_list, event_wait_list, event);
463 }
464 else
465 {
466 return CL_OUT_OF_RESOURCES;
467 }
468}
469
470cl_int clEnqueueReadBuffer(
471 cl_command_queue command_queue,
472 cl_mem buffer,
473 cl_bool blocking_read,
474 size_t offset,
475 size_t size,
476 void *ptr,
477 cl_uint num_events_in_wait_list,
478 const cl_event *event_wait_list,
479 cl_event *event)
480{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100481 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000482 auto func = arm_compute::CLSymbols::get().clEnqueueReadBuffer_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100483 if(func != nullptr)
484 {
485 return func(command_queue, buffer, blocking_read, offset, size, ptr, num_events_in_wait_list, event_wait_list, event);
486 }
487 else
488 {
489 return CL_OUT_OF_RESOURCES;
490 }
491}
492
493cl_int clGetProgramBuildInfo(
494 cl_program program,
495 cl_device_id device,
496 cl_program_build_info param_name,
497 size_t param_value_size,
498 void *param_value,
499 size_t *param_value_size_ret)
500{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100501 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000502 auto func = arm_compute::CLSymbols::get().clGetProgramBuildInfo_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100503 if(func != nullptr)
504 {
505 return func(program, device, param_name, param_value_size, param_value, param_value_size_ret);
506 }
507 else
508 {
509 return CL_OUT_OF_RESOURCES;
510 }
511}
512
513cl_int clRetainProgram(cl_program program)
514{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100515 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000516 auto func = arm_compute::CLSymbols::get().clRetainProgram_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100517 if(func != nullptr)
518 {
519 return func(program);
520 }
521 else
522 {
523 return CL_OUT_OF_RESOURCES;
524 }
525}
526
527void *clEnqueueMapBuffer(
528 cl_command_queue command_queue,
529 cl_mem buffer,
530 cl_bool blocking_map,
531 cl_map_flags map_flags,
532 size_t offset,
533 size_t size,
534 cl_uint num_events_in_wait_list,
535 const cl_event *event_wait_list,
536 cl_event *event,
537 cl_int *errcode_ret)
538{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100539 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000540 auto func = arm_compute::CLSymbols::get().clEnqueueMapBuffer_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100541 if(func != nullptr)
542 {
543 return func(command_queue, buffer, blocking_map, map_flags, offset, size, num_events_in_wait_list, event_wait_list, event, errcode_ret);
544 }
545 else
546 {
547 if(errcode_ret != nullptr)
548 {
549 *errcode_ret = CL_OUT_OF_RESOURCES;
550 }
551 return nullptr;
552 }
553}
554
555cl_int clReleaseCommandQueue(cl_command_queue command_queue)
556{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100557 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000558 auto func = arm_compute::CLSymbols::get().clReleaseCommandQueue_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100559 if(func != nullptr)
560 {
561 return func(command_queue);
562 }
563 else
564 {
565 return CL_OUT_OF_RESOURCES;
566 }
567}
568
569cl_program clCreateProgramWithBinary(
570 cl_context context,
571 cl_uint num_devices,
572 const cl_device_id *device_list,
573 const size_t *lengths,
574 const unsigned char **binaries,
575 cl_int *binary_status,
576 cl_int *errcode_ret)
577{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100578 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000579 auto func = arm_compute::CLSymbols::get().clCreateProgramWithBinary_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100580 if(func != nullptr)
581 {
582 return func(context, num_devices, device_list, lengths, binaries, binary_status, errcode_ret);
583 }
584 else
585 {
586 if(errcode_ret != nullptr)
587 {
588 *errcode_ret = CL_OUT_OF_RESOURCES;
589 }
590 return nullptr;
591 }
592}
593
594cl_int clRetainContext(cl_context context)
595{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100596 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000597 auto func = arm_compute::CLSymbols::get().clRetainContext_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100598 if(func != nullptr)
599 {
600 return func(context);
601 }
602 else
603 {
604 return CL_OUT_OF_RESOURCES;
605 }
606}
607
608cl_int clReleaseProgram(cl_program program)
609{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100610 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000611 auto func = arm_compute::CLSymbols::get().clReleaseProgram_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100612 if(func != nullptr)
613 {
614 return func(program);
615 }
616 else
617 {
618 return CL_OUT_OF_RESOURCES;
619 }
620}
621
622cl_int clFlush(cl_command_queue command_queue)
623{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100624 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000625 auto func = arm_compute::CLSymbols::get().clFlush_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100626 if(func != nullptr)
627 {
628 return func(command_queue);
629 }
630 else
631 {
632 return CL_OUT_OF_RESOURCES;
633 }
634}
635
Gian Marco Iodice63d76a72017-08-11 11:56:52 +0100636cl_int clFinish(cl_command_queue command_queue)
637{
638 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000639 auto func = arm_compute::CLSymbols::get().clFinish_ptr;
Gian Marco Iodice63d76a72017-08-11 11:56:52 +0100640 if(func != nullptr)
641 {
642 return func(command_queue);
643 }
644 else
645 {
646 return CL_OUT_OF_RESOURCES;
647 }
648}
649
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100650cl_int clGetProgramInfo(
651 cl_program program,
652 cl_program_info param_name,
653 size_t param_value_size,
654 void *param_value,
655 size_t *param_value_size_ret)
656{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100657 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000658 auto func = arm_compute::CLSymbols::get().clGetProgramInfo_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100659 if(func != nullptr)
660 {
661 return func(program, param_name, param_value_size, param_value, param_value_size_ret);
662 }
663 else
664 {
665 return CL_OUT_OF_RESOURCES;
666 }
667}
668
669cl_kernel clCreateKernel(
670 cl_program program,
671 const char *kernel_name,
672 cl_int *errcode_ret)
673{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100674 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000675 auto func = arm_compute::CLSymbols::get().clCreateKernel_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100676 if(func != nullptr)
677 {
678 return func(program, kernel_name, errcode_ret);
679 }
680 else
681 {
682 if(errcode_ret != nullptr)
683 {
684 *errcode_ret = CL_OUT_OF_RESOURCES;
685 }
686 return nullptr;
687 }
688}
689
690cl_int clRetainKernel(cl_kernel kernel)
691{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100692 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000693 auto func = arm_compute::CLSymbols::get().clRetainKernel_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100694 if(func != nullptr)
695 {
696 return func(kernel);
697 }
698 else
699 {
700 return CL_OUT_OF_RESOURCES;
701 }
702}
703
704cl_mem clCreateBuffer(
705 cl_context context,
706 cl_mem_flags flags,
707 size_t size,
708 void *host_ptr,
709 cl_int *errcode_ret)
710{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100711 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000712 auto func = arm_compute::CLSymbols::get().clCreateBuffer_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100713 if(func != nullptr)
714 {
715 return func(context, flags, size, host_ptr, errcode_ret);
716 }
717 else
718 {
719 if(errcode_ret != nullptr)
720 {
721 *errcode_ret = CL_OUT_OF_RESOURCES;
722 }
723 return nullptr;
724 }
725}
726
727cl_program clCreateProgramWithSource(
728 cl_context context,
729 cl_uint count,
730 const char **strings,
731 const size_t *lengths,
732 cl_int *errcode_ret)
733{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100734 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000735 auto func = arm_compute::CLSymbols::get().clCreateProgramWithSource_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100736 if(func != nullptr)
737 {
738 return func(context, count, strings, lengths, errcode_ret);
739 }
740 else
741 {
742 if(errcode_ret != nullptr)
743 {
744 *errcode_ret = CL_OUT_OF_RESOURCES;
745 }
746 return nullptr;
747 }
748}
749
750cl_int clReleaseKernel(cl_kernel kernel)
751{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100752 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000753 auto func = arm_compute::CLSymbols::get().clReleaseKernel_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100754 if(func != nullptr)
755 {
756 return func(kernel);
757 }
758 else
759 {
760 return CL_OUT_OF_RESOURCES;
761 }
762}
763
764cl_int clGetDeviceIDs(cl_platform_id platform,
765 cl_device_type device_type,
766 cl_uint num_entries,
767 cl_device_id *devices,
768 cl_uint *num_devices)
769{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100770 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000771 auto func = arm_compute::CLSymbols::get().clGetDeviceIDs_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100772 if(func != nullptr)
773 {
774 return func(platform, device_type, num_entries, devices, num_devices);
775 }
776 else
777 {
778 return CL_OUT_OF_RESOURCES;
779 }
780}
781
782cl_int clGetDeviceInfo(cl_device_id device,
783 cl_device_info param_name,
784 size_t param_value_size,
785 void *param_value,
786 size_t *param_value_size_ret)
787{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100788 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000789 auto func = arm_compute::CLSymbols::get().clGetDeviceInfo_ptr;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100790 if(func != nullptr)
791 {
792 return func(device, param_name, param_value_size, param_value, param_value_size_ret);
793 }
794 else
795 {
796 return CL_OUT_OF_RESOURCES;
797 }
798}
Giorgio Arena9fe41442017-08-23 16:36:24 +0100799
Georgios Pinitasdf310362018-11-14 13:16:56 +0000800cl_int clGetMemObjectInfo(cl_mem memobj,
801 cl_mem_info param_name,
802 size_t param_value_size,
803 void *param_value,
804 size_t *param_value_size_ret)
805{
806 arm_compute::CLSymbols::get().load_default();
807 auto func = arm_compute::CLSymbols::get().clGetMemObjectInfo_ptr;
808 if(func != nullptr)
809 {
810 return func(memobj, param_name, param_value_size, param_value, param_value_size_ret);
811 }
812 else
813 {
814 return CL_OUT_OF_RESOURCES;
815 }
816}
817
Giorgio Arena9fe41442017-08-23 16:36:24 +0100818cl_int clRetainEvent(cl_event event)
819{
Moritz Pflanzer159b6da2017-09-20 16:03:35 +0100820 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000821 auto func = arm_compute::CLSymbols::get().clRetainEvent_ptr;
Giorgio Arena9fe41442017-08-23 16:36:24 +0100822 if(func != nullptr)
823 {
824 return func(event);
825 }
826 else
827 {
828 return CL_OUT_OF_RESOURCES;
829 }
830}
steniu01f01f9de2017-09-27 17:00:11 +0100831
832cl_int clGetPlatformIDs(cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms)
833{
834 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000835 auto func = arm_compute::CLSymbols::get().clGetPlatformIDs_ptr;
steniu01f01f9de2017-09-27 17:00:11 +0100836 if(func != nullptr)
837 {
838 return func(num_entries, platforms, num_platforms);
839 }
840 else
841 {
842 return CL_OUT_OF_RESOURCES;
843 }
844}
Abel Bernabeu5a6e0532017-09-28 09:53:45 +0100845
846cl_int
847clGetKernelWorkGroupInfo(cl_kernel kernel,
848 cl_device_id device,
849 cl_kernel_work_group_info param_name,
850 size_t param_value_size,
851 void *param_value,
852 size_t *param_value_size_ret)
853{
854 arm_compute::CLSymbols::get().load_default();
Anthony Barbier58c4ff12017-11-09 09:15:32 +0000855 auto func = arm_compute::CLSymbols::get().clGetKernelWorkGroupInfo_ptr;
Abel Bernabeu5a6e0532017-09-28 09:53:45 +0100856 if(func != nullptr)
857 {
858 return func(kernel, device, param_name, param_value_size, param_value, param_value_size_ret);
859 }
860 else
861 {
862 return CL_OUT_OF_RESOURCES;
863 }
864}
Gian Marco85e6f512018-02-01 16:57:48 +0000865
866cl_int
867clGetCommandQueueInfo(cl_command_queue command_queue,
868 cl_command_queue_info param_name,
869 size_t param_value_size,
870 void *param_value,
871 size_t *param_value_size_ret)
872{
873 arm_compute::CLSymbols::get().load_default();
874 auto func = arm_compute::CLSymbols::get().clGetCommandQueueInfo_ptr;
875 if(func != nullptr)
876 {
877 return func(command_queue, param_name, param_value_size, param_value, param_value_size_ret);
878 }
879 else
880 {
881 return CL_OUT_OF_RESOURCES;
882 }
883}
884
885cl_int
886clGetKernelInfo(cl_kernel kernel,
887 cl_kernel_info param_name,
888 size_t param_value_size,
889 void *param_value,
890 size_t *param_value_size_ret)
891{
892 arm_compute::CLSymbols::get().load_default();
893 auto func = arm_compute::CLSymbols::get().clGetKernelInfo_ptr;
894 if(func != nullptr)
895 {
896 return func(kernel, param_name, param_value_size, param_value, param_value_size_ret);
897 }
898 else
899 {
900 return CL_OUT_OF_RESOURCES;
901 }
902}
903
904cl_int
905clGetEventProfilingInfo(cl_event event,
906 cl_profiling_info param_name,
907 size_t param_value_size,
908 void *param_value,
909 size_t *param_value_size_ret)
910{
911 arm_compute::CLSymbols::get().load_default();
912 auto func = arm_compute::CLSymbols::get().clGetEventProfilingInfo_ptr;
913 if(func != nullptr)
914 {
915 return func(event, param_name, param_value_size, param_value, param_value_size_ret);
916 }
917 else
918 {
919 return CL_OUT_OF_RESOURCES;
920 }
Anthony Barbierf5dcf792018-02-28 18:04:45 +0000921}