blob: 287c5e2f5a355afa6887a6f5b886782d96ade0f1 [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
2 * Copyright (c) 2017 ARM Limited.
3 *
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
Moritz Pflanzer725788e2017-07-07 15:35:56 +010074 clBuildProgram = reinterpret_cast<clBuildProgram_func>(dlsym(handle, "clBuildProgram"));
75 clEnqueueNDRangeKernel = reinterpret_cast<clEnqueueNDRangeKernel_func>(dlsym(handle, "clEnqueueNDRangeKernel"));
76 clSetKernelArg = reinterpret_cast<clSetKernelArg_func>(dlsym(handle, "clSetKernelArg"));
77 clReleaseKernel = reinterpret_cast<clReleaseKernel_func>(dlsym(handle, "clReleaseKernel"));
78 clCreateProgramWithSource = reinterpret_cast<clCreateProgramWithSource_func>(dlsym(handle, "clCreateProgramWithSource"));
79 clCreateBuffer = reinterpret_cast<clCreateBuffer_func>(dlsym(handle, "clCreateBuffer"));
80 clRetainKernel = reinterpret_cast<clRetainKernel_func>(dlsym(handle, "clRetainKernel"));
81 clCreateKernel = reinterpret_cast<clCreateKernel_func>(dlsym(handle, "clCreateKernel"));
82 clGetProgramInfo = reinterpret_cast<clGetProgramInfo_func>(dlsym(handle, "clGetProgramInfo"));
83 clFlush = reinterpret_cast<clFlush_func>(dlsym(handle, "clFlush"));
Gian Marco Iodice63d76a72017-08-11 11:56:52 +010084 clFinish = reinterpret_cast<clFinish_func>(dlsym(handle, "clFinish"));
Moritz Pflanzer725788e2017-07-07 15:35:56 +010085 clReleaseProgram = reinterpret_cast<clReleaseProgram_func>(dlsym(handle, "clReleaseProgram"));
86 clRetainContext = reinterpret_cast<clRetainContext_func>(dlsym(handle, "clRetainContext"));
87 clCreateProgramWithBinary = reinterpret_cast<clCreateProgramWithBinary_func>(dlsym(handle, "clCreateProgramWithBinary"));
88 clReleaseCommandQueue = reinterpret_cast<clReleaseCommandQueue_func>(dlsym(handle, "clReleaseCommandQueue"));
89 clEnqueueMapBuffer = reinterpret_cast<clEnqueueMapBuffer_func>(dlsym(handle, "clEnqueueMapBuffer"));
90 clRetainProgram = reinterpret_cast<clRetainProgram_func>(dlsym(handle, "clRetainProgram"));
91 clGetProgramBuildInfo = reinterpret_cast<clGetProgramBuildInfo_func>(dlsym(handle, "clGetProgramBuildInfo"));
92 clEnqueueReadBuffer = reinterpret_cast<clEnqueueReadBuffer_func>(dlsym(handle, "clEnqueueReadBuffer"));
93 clEnqueueWriteBuffer = reinterpret_cast<clEnqueueWriteBuffer_func>(dlsym(handle, "clEnqueueWriteBuffer"));
94 clReleaseEvent = reinterpret_cast<clReleaseEvent_func>(dlsym(handle, "clReleaseEvent"));
95 clReleaseContext = reinterpret_cast<clReleaseContext_func>(dlsym(handle, "clReleaseContext"));
96 clRetainCommandQueue = reinterpret_cast<clRetainCommandQueue_func>(dlsym(handle, "clRetainCommandQueue"));
97 clEnqueueUnmapMemObject = reinterpret_cast<clEnqueueUnmapMemObject_func>(dlsym(handle, "clEnqueueUnmapMemObject"));
Georgios Pinitasbaf174e2017-09-08 19:47:30 +010098 clRetainMemObject = reinterpret_cast<clRetainMemObject_func>(dlsym(handle, "clRetainMemObject"));
Moritz Pflanzer725788e2017-07-07 15:35:56 +010099 clReleaseMemObject = reinterpret_cast<clReleaseMemObject_func>(dlsym(handle, "clReleaseMemObject"));
100 clGetDeviceInfo = reinterpret_cast<clGetDeviceInfo_func>(dlsym(handle, "clGetDeviceInfo"));
101 clGetDeviceIDs = reinterpret_cast<clGetDeviceIDs_func>(dlsym(handle, "clGetDeviceIDs"));
Giorgio Arena9fe41442017-08-23 16:36:24 +0100102 clRetainEvent = reinterpret_cast<clRetainEvent_func>(dlsym(handle, "clRetainEvent"));
steniu01f01f9de2017-09-27 17:00:11 +0100103 clGetPlatformIDs = reinterpret_cast<clGetPlatformIDs_func>(dlsym(handle, "clGetPlatformIDs"));
Abel Bernabeu5a6e0532017-09-28 09:53:45 +0100104 clGetKernelWorkGroupInfo = reinterpret_cast<clGetKernelWorkGroupInfo_func>(dlsym(handle, "clGetKernelWorkGroupInfo"));
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100105
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100106 dlclose(handle);
107
108 // Disable default loading and set status to successful
109 _loaded = std::make_pair(true, true);
110
111 return true;
112}
113
114bool opencl_is_available()
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100115{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100116 CLSymbols::get().load_default();
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100117 return CLSymbols::get().clBuildProgram != nullptr;
118}
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100119} // namespace arm_compute
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100120
121cl_int clBuildProgram(
122 cl_program program,
123 cl_uint num_devices,
124 const cl_device_id *device_list,
125 const char *options,
126 void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
127 void *user_data)
128{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100129 arm_compute::CLSymbols::get().load_default();
130 auto func = arm_compute::CLSymbols::get().clBuildProgram;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100131 if(func != nullptr)
132 {
133 return func(program, num_devices, device_list, options, pfn_notify, user_data);
134 }
135 else
136 {
137 return CL_OUT_OF_RESOURCES;
138 }
139}
140
141cl_int clEnqueueNDRangeKernel(
142 cl_command_queue command_queue,
143 cl_kernel kernel,
144 cl_uint work_dim,
145 const size_t *global_work_offset,
146 const size_t *global_work_size,
147 const size_t *local_work_size,
148 cl_uint num_events_in_wait_list,
149 const cl_event *event_wait_list,
150 cl_event *event)
151{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100152 arm_compute::CLSymbols::get().load_default();
153 auto func = arm_compute::CLSymbols::get().clEnqueueNDRangeKernel;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100154 if(func != nullptr)
155 {
156 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);
157 }
158 else
159 {
160 return CL_OUT_OF_RESOURCES;
161 }
162}
163
164cl_int clSetKernelArg(
165 cl_kernel kernel,
166 cl_uint arg_index,
167 size_t arg_size,
168 const void *arg_value)
169{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100170 arm_compute::CLSymbols::get().load_default();
171 auto func = arm_compute::CLSymbols::get().clSetKernelArg;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100172 if(func != nullptr)
173 {
174 return func(kernel, arg_index, arg_size, arg_value);
175 }
176 else
177 {
178 return CL_OUT_OF_RESOURCES;
179 }
180}
181
Georgios Pinitasbaf174e2017-09-08 19:47:30 +0100182cl_int clRetainMemObject(cl_mem memobj)
183{
184 arm_compute::CLSymbols::get().load_default();
185 auto func = arm_compute::CLSymbols::get().clRetainMemObject;
186 if(func != nullptr)
187 {
188 return func(memobj);
189 }
190 else
191 {
192 return CL_OUT_OF_RESOURCES;
193 }
194}
195
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100196cl_int clReleaseMemObject(cl_mem memobj)
197{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100198 arm_compute::CLSymbols::get().load_default();
199 auto func = arm_compute::CLSymbols::get().clReleaseMemObject;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100200 if(func != nullptr)
201 {
202 return func(memobj);
203 }
204 else
205 {
206 return CL_OUT_OF_RESOURCES;
207 }
208}
209
210cl_int clEnqueueUnmapMemObject(
211 cl_command_queue command_queue,
212 cl_mem memobj,
213 void *mapped_ptr,
214 cl_uint num_events_in_wait_list,
215 const cl_event *event_wait_list,
216 cl_event *event)
217{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100218 arm_compute::CLSymbols::get().load_default();
219 auto func = arm_compute::CLSymbols::get().clEnqueueUnmapMemObject;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100220 if(func != nullptr)
221 {
222 return func(command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
223 }
224 else
225 {
226 return CL_OUT_OF_RESOURCES;
227 }
228}
229
230cl_int clRetainCommandQueue(cl_command_queue command_queue)
231{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100232 arm_compute::CLSymbols::get().load_default();
233 auto func = arm_compute::CLSymbols::get().clRetainCommandQueue;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100234 if(func != nullptr)
235 {
236 return func(command_queue);
237 }
238 else
239 {
240 return CL_OUT_OF_RESOURCES;
241 }
242}
243
244cl_int clReleaseContext(cl_context context)
245{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100246 arm_compute::CLSymbols::get().load_default();
247 auto func = arm_compute::CLSymbols::get().clReleaseContext;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100248 if(func != nullptr)
249 {
250 return func(context);
251 }
252 else
253 {
254 return CL_OUT_OF_RESOURCES;
255 }
256}
257cl_int clReleaseEvent(cl_event event)
258{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100259 arm_compute::CLSymbols::get().load_default();
260 auto func = arm_compute::CLSymbols::get().clReleaseEvent;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100261 if(func != nullptr)
262 {
263 return func(event);
264 }
265 else
266 {
267 return CL_OUT_OF_RESOURCES;
268 }
269}
270
271cl_int clEnqueueWriteBuffer(
272 cl_command_queue command_queue,
273 cl_mem buffer,
274 cl_bool blocking_write,
275 size_t offset,
276 size_t size,
277 const void *ptr,
278 cl_uint num_events_in_wait_list,
279 const cl_event *event_wait_list,
280 cl_event *event)
281{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100282 arm_compute::CLSymbols::get().load_default();
283 auto func = arm_compute::CLSymbols::get().clEnqueueWriteBuffer;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100284 if(func != nullptr)
285 {
286 return func(command_queue, buffer, blocking_write, offset, size, ptr, num_events_in_wait_list, event_wait_list, event);
287 }
288 else
289 {
290 return CL_OUT_OF_RESOURCES;
291 }
292}
293
294cl_int clEnqueueReadBuffer(
295 cl_command_queue command_queue,
296 cl_mem buffer,
297 cl_bool blocking_read,
298 size_t offset,
299 size_t size,
300 void *ptr,
301 cl_uint num_events_in_wait_list,
302 const cl_event *event_wait_list,
303 cl_event *event)
304{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100305 arm_compute::CLSymbols::get().load_default();
306 auto func = arm_compute::CLSymbols::get().clEnqueueReadBuffer;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100307 if(func != nullptr)
308 {
309 return func(command_queue, buffer, blocking_read, offset, size, ptr, num_events_in_wait_list, event_wait_list, event);
310 }
311 else
312 {
313 return CL_OUT_OF_RESOURCES;
314 }
315}
316
317cl_int clGetProgramBuildInfo(
318 cl_program program,
319 cl_device_id device,
320 cl_program_build_info param_name,
321 size_t param_value_size,
322 void *param_value,
323 size_t *param_value_size_ret)
324{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100325 arm_compute::CLSymbols::get().load_default();
326 auto func = arm_compute::CLSymbols::get().clGetProgramBuildInfo;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100327 if(func != nullptr)
328 {
329 return func(program, device, param_name, param_value_size, param_value, param_value_size_ret);
330 }
331 else
332 {
333 return CL_OUT_OF_RESOURCES;
334 }
335}
336
337cl_int clRetainProgram(cl_program program)
338{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100339 arm_compute::CLSymbols::get().load_default();
340 auto func = arm_compute::CLSymbols::get().clRetainProgram;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100341 if(func != nullptr)
342 {
343 return func(program);
344 }
345 else
346 {
347 return CL_OUT_OF_RESOURCES;
348 }
349}
350
351void *clEnqueueMapBuffer(
352 cl_command_queue command_queue,
353 cl_mem buffer,
354 cl_bool blocking_map,
355 cl_map_flags map_flags,
356 size_t offset,
357 size_t size,
358 cl_uint num_events_in_wait_list,
359 const cl_event *event_wait_list,
360 cl_event *event,
361 cl_int *errcode_ret)
362{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100363 arm_compute::CLSymbols::get().load_default();
364 auto func = arm_compute::CLSymbols::get().clEnqueueMapBuffer;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100365 if(func != nullptr)
366 {
367 return func(command_queue, buffer, blocking_map, map_flags, offset, size, num_events_in_wait_list, event_wait_list, event, errcode_ret);
368 }
369 else
370 {
371 if(errcode_ret != nullptr)
372 {
373 *errcode_ret = CL_OUT_OF_RESOURCES;
374 }
375 return nullptr;
376 }
377}
378
379cl_int clReleaseCommandQueue(cl_command_queue command_queue)
380{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100381 arm_compute::CLSymbols::get().load_default();
382 auto func = arm_compute::CLSymbols::get().clReleaseCommandQueue;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100383 if(func != nullptr)
384 {
385 return func(command_queue);
386 }
387 else
388 {
389 return CL_OUT_OF_RESOURCES;
390 }
391}
392
393cl_program clCreateProgramWithBinary(
394 cl_context context,
395 cl_uint num_devices,
396 const cl_device_id *device_list,
397 const size_t *lengths,
398 const unsigned char **binaries,
399 cl_int *binary_status,
400 cl_int *errcode_ret)
401{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100402 arm_compute::CLSymbols::get().load_default();
403 auto func = arm_compute::CLSymbols::get().clCreateProgramWithBinary;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100404 if(func != nullptr)
405 {
406 return func(context, num_devices, device_list, lengths, binaries, binary_status, errcode_ret);
407 }
408 else
409 {
410 if(errcode_ret != nullptr)
411 {
412 *errcode_ret = CL_OUT_OF_RESOURCES;
413 }
414 return nullptr;
415 }
416}
417
418cl_int clRetainContext(cl_context context)
419{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100420 arm_compute::CLSymbols::get().load_default();
421 auto func = arm_compute::CLSymbols::get().clRetainContext;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100422 if(func != nullptr)
423 {
424 return func(context);
425 }
426 else
427 {
428 return CL_OUT_OF_RESOURCES;
429 }
430}
431
432cl_int clReleaseProgram(cl_program program)
433{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100434 arm_compute::CLSymbols::get().load_default();
435 auto func = arm_compute::CLSymbols::get().clReleaseProgram;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100436 if(func != nullptr)
437 {
438 return func(program);
439 }
440 else
441 {
442 return CL_OUT_OF_RESOURCES;
443 }
444}
445
446cl_int clFlush(cl_command_queue command_queue)
447{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100448 arm_compute::CLSymbols::get().load_default();
449 auto func = arm_compute::CLSymbols::get().clFlush;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100450 if(func != nullptr)
451 {
452 return func(command_queue);
453 }
454 else
455 {
456 return CL_OUT_OF_RESOURCES;
457 }
458}
459
Gian Marco Iodice63d76a72017-08-11 11:56:52 +0100460cl_int clFinish(cl_command_queue command_queue)
461{
462 arm_compute::CLSymbols::get().load_default();
463 auto func = arm_compute::CLSymbols::get().clFinish;
464 if(func != nullptr)
465 {
466 return func(command_queue);
467 }
468 else
469 {
470 return CL_OUT_OF_RESOURCES;
471 }
472}
473
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100474cl_int clGetProgramInfo(
475 cl_program program,
476 cl_program_info param_name,
477 size_t param_value_size,
478 void *param_value,
479 size_t *param_value_size_ret)
480{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100481 arm_compute::CLSymbols::get().load_default();
482 auto func = arm_compute::CLSymbols::get().clGetProgramInfo;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100483 if(func != nullptr)
484 {
485 return func(program, param_name, param_value_size, param_value, param_value_size_ret);
486 }
487 else
488 {
489 return CL_OUT_OF_RESOURCES;
490 }
491}
492
493cl_kernel clCreateKernel(
494 cl_program program,
495 const char *kernel_name,
496 cl_int *errcode_ret)
497{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100498 arm_compute::CLSymbols::get().load_default();
499 auto func = arm_compute::CLSymbols::get().clCreateKernel;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100500 if(func != nullptr)
501 {
502 return func(program, kernel_name, errcode_ret);
503 }
504 else
505 {
506 if(errcode_ret != nullptr)
507 {
508 *errcode_ret = CL_OUT_OF_RESOURCES;
509 }
510 return nullptr;
511 }
512}
513
514cl_int clRetainKernel(cl_kernel kernel)
515{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100516 arm_compute::CLSymbols::get().load_default();
517 auto func = arm_compute::CLSymbols::get().clRetainKernel;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100518 if(func != nullptr)
519 {
520 return func(kernel);
521 }
522 else
523 {
524 return CL_OUT_OF_RESOURCES;
525 }
526}
527
528cl_mem clCreateBuffer(
529 cl_context context,
530 cl_mem_flags flags,
531 size_t size,
532 void *host_ptr,
533 cl_int *errcode_ret)
534{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100535 arm_compute::CLSymbols::get().load_default();
536 auto func = arm_compute::CLSymbols::get().clCreateBuffer;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100537 if(func != nullptr)
538 {
539 return func(context, flags, size, host_ptr, errcode_ret);
540 }
541 else
542 {
543 if(errcode_ret != nullptr)
544 {
545 *errcode_ret = CL_OUT_OF_RESOURCES;
546 }
547 return nullptr;
548 }
549}
550
551cl_program clCreateProgramWithSource(
552 cl_context context,
553 cl_uint count,
554 const char **strings,
555 const size_t *lengths,
556 cl_int *errcode_ret)
557{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100558 arm_compute::CLSymbols::get().load_default();
559 auto func = arm_compute::CLSymbols::get().clCreateProgramWithSource;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100560 if(func != nullptr)
561 {
562 return func(context, count, strings, lengths, errcode_ret);
563 }
564 else
565 {
566 if(errcode_ret != nullptr)
567 {
568 *errcode_ret = CL_OUT_OF_RESOURCES;
569 }
570 return nullptr;
571 }
572}
573
574cl_int clReleaseKernel(cl_kernel kernel)
575{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100576 arm_compute::CLSymbols::get().load_default();
577 auto func = arm_compute::CLSymbols::get().clReleaseKernel;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100578 if(func != nullptr)
579 {
580 return func(kernel);
581 }
582 else
583 {
584 return CL_OUT_OF_RESOURCES;
585 }
586}
587
588cl_int clGetDeviceIDs(cl_platform_id platform,
589 cl_device_type device_type,
590 cl_uint num_entries,
591 cl_device_id *devices,
592 cl_uint *num_devices)
593{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100594 arm_compute::CLSymbols::get().load_default();
595 auto func = arm_compute::CLSymbols::get().clGetDeviceIDs;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100596 if(func != nullptr)
597 {
598 return func(platform, device_type, num_entries, devices, num_devices);
599 }
600 else
601 {
602 return CL_OUT_OF_RESOURCES;
603 }
604}
605
606cl_int clGetDeviceInfo(cl_device_id device,
607 cl_device_info param_name,
608 size_t param_value_size,
609 void *param_value,
610 size_t *param_value_size_ret)
611{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100612 arm_compute::CLSymbols::get().load_default();
613 auto func = arm_compute::CLSymbols::get().clGetDeviceInfo;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100614 if(func != nullptr)
615 {
616 return func(device, param_name, param_value_size, param_value, param_value_size_ret);
617 }
618 else
619 {
620 return CL_OUT_OF_RESOURCES;
621 }
622}
Giorgio Arena9fe41442017-08-23 16:36:24 +0100623
624cl_int clRetainEvent(cl_event event)
625{
Moritz Pflanzer159b6da2017-09-20 16:03:35 +0100626 arm_compute::CLSymbols::get().load_default();
Giorgio Arena9fe41442017-08-23 16:36:24 +0100627 auto func = arm_compute::CLSymbols::get().clRetainEvent;
628 if(func != nullptr)
629 {
630 return func(event);
631 }
632 else
633 {
634 return CL_OUT_OF_RESOURCES;
635 }
636}
steniu01f01f9de2017-09-27 17:00:11 +0100637
638cl_int clGetPlatformIDs(cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms)
639{
640 arm_compute::CLSymbols::get().load_default();
641 auto func = arm_compute::CLSymbols::get().clGetPlatformIDs;
642 if(func != nullptr)
643 {
644 return func(num_entries, platforms, num_platforms);
645 }
646 else
647 {
648 return CL_OUT_OF_RESOURCES;
649 }
650}
Abel Bernabeu5a6e0532017-09-28 09:53:45 +0100651
652cl_int
653clGetKernelWorkGroupInfo(cl_kernel kernel,
654 cl_device_id device,
655 cl_kernel_work_group_info param_name,
656 size_t param_value_size,
657 void *param_value,
658 size_t *param_value_size_ret)
659{
660 arm_compute::CLSymbols::get().load_default();
661 auto func = arm_compute::CLSymbols::get().clGetKernelWorkGroupInfo;
662 if(func != nullptr)
663 {
664 return func(kernel, device, param_name, param_value_size, param_value, param_value_size_ret);
665 }
666 else
667 {
668 return CL_OUT_OF_RESOURCES;
669 }
670}