blob: 1d04f397fd8aa37f45ae6cb88b39da8b744aa242 [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"));
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100103
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100104 dlclose(handle);
105
106 // Disable default loading and set status to successful
107 _loaded = std::make_pair(true, true);
108
109 return true;
110}
111
112bool opencl_is_available()
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100113{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100114 CLSymbols::get().load_default();
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100115 return CLSymbols::get().clBuildProgram != nullptr;
116}
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100117} // namespace arm_compute
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100118
119cl_int clBuildProgram(
120 cl_program program,
121 cl_uint num_devices,
122 const cl_device_id *device_list,
123 const char *options,
124 void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
125 void *user_data)
126{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100127 arm_compute::CLSymbols::get().load_default();
128 auto func = arm_compute::CLSymbols::get().clBuildProgram;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100129 if(func != nullptr)
130 {
131 return func(program, num_devices, device_list, options, pfn_notify, user_data);
132 }
133 else
134 {
135 return CL_OUT_OF_RESOURCES;
136 }
137}
138
139cl_int clEnqueueNDRangeKernel(
140 cl_command_queue command_queue,
141 cl_kernel kernel,
142 cl_uint work_dim,
143 const size_t *global_work_offset,
144 const size_t *global_work_size,
145 const size_t *local_work_size,
146 cl_uint num_events_in_wait_list,
147 const cl_event *event_wait_list,
148 cl_event *event)
149{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100150 arm_compute::CLSymbols::get().load_default();
151 auto func = arm_compute::CLSymbols::get().clEnqueueNDRangeKernel;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100152 if(func != nullptr)
153 {
154 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);
155 }
156 else
157 {
158 return CL_OUT_OF_RESOURCES;
159 }
160}
161
162cl_int clSetKernelArg(
163 cl_kernel kernel,
164 cl_uint arg_index,
165 size_t arg_size,
166 const void *arg_value)
167{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100168 arm_compute::CLSymbols::get().load_default();
169 auto func = arm_compute::CLSymbols::get().clSetKernelArg;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100170 if(func != nullptr)
171 {
172 return func(kernel, arg_index, arg_size, arg_value);
173 }
174 else
175 {
176 return CL_OUT_OF_RESOURCES;
177 }
178}
179
Georgios Pinitasbaf174e2017-09-08 19:47:30 +0100180cl_int clRetainMemObject(cl_mem memobj)
181{
182 arm_compute::CLSymbols::get().load_default();
183 auto func = arm_compute::CLSymbols::get().clRetainMemObject;
184 if(func != nullptr)
185 {
186 return func(memobj);
187 }
188 else
189 {
190 return CL_OUT_OF_RESOURCES;
191 }
192}
193
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100194cl_int clReleaseMemObject(cl_mem memobj)
195{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100196 arm_compute::CLSymbols::get().load_default();
197 auto func = arm_compute::CLSymbols::get().clReleaseMemObject;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100198 if(func != nullptr)
199 {
200 return func(memobj);
201 }
202 else
203 {
204 return CL_OUT_OF_RESOURCES;
205 }
206}
207
208cl_int clEnqueueUnmapMemObject(
209 cl_command_queue command_queue,
210 cl_mem memobj,
211 void *mapped_ptr,
212 cl_uint num_events_in_wait_list,
213 const cl_event *event_wait_list,
214 cl_event *event)
215{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100216 arm_compute::CLSymbols::get().load_default();
217 auto func = arm_compute::CLSymbols::get().clEnqueueUnmapMemObject;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100218 if(func != nullptr)
219 {
220 return func(command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
221 }
222 else
223 {
224 return CL_OUT_OF_RESOURCES;
225 }
226}
227
228cl_int clRetainCommandQueue(cl_command_queue command_queue)
229{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100230 arm_compute::CLSymbols::get().load_default();
231 auto func = arm_compute::CLSymbols::get().clRetainCommandQueue;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100232 if(func != nullptr)
233 {
234 return func(command_queue);
235 }
236 else
237 {
238 return CL_OUT_OF_RESOURCES;
239 }
240}
241
242cl_int clReleaseContext(cl_context context)
243{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100244 arm_compute::CLSymbols::get().load_default();
245 auto func = arm_compute::CLSymbols::get().clReleaseContext;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100246 if(func != nullptr)
247 {
248 return func(context);
249 }
250 else
251 {
252 return CL_OUT_OF_RESOURCES;
253 }
254}
255cl_int clReleaseEvent(cl_event event)
256{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100257 arm_compute::CLSymbols::get().load_default();
258 auto func = arm_compute::CLSymbols::get().clReleaseEvent;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100259 if(func != nullptr)
260 {
261 return func(event);
262 }
263 else
264 {
265 return CL_OUT_OF_RESOURCES;
266 }
267}
268
269cl_int clEnqueueWriteBuffer(
270 cl_command_queue command_queue,
271 cl_mem buffer,
272 cl_bool blocking_write,
273 size_t offset,
274 size_t size,
275 const void *ptr,
276 cl_uint num_events_in_wait_list,
277 const cl_event *event_wait_list,
278 cl_event *event)
279{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100280 arm_compute::CLSymbols::get().load_default();
281 auto func = arm_compute::CLSymbols::get().clEnqueueWriteBuffer;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100282 if(func != nullptr)
283 {
284 return func(command_queue, buffer, blocking_write, offset, size, ptr, num_events_in_wait_list, event_wait_list, event);
285 }
286 else
287 {
288 return CL_OUT_OF_RESOURCES;
289 }
290}
291
292cl_int clEnqueueReadBuffer(
293 cl_command_queue command_queue,
294 cl_mem buffer,
295 cl_bool blocking_read,
296 size_t offset,
297 size_t size,
298 void *ptr,
299 cl_uint num_events_in_wait_list,
300 const cl_event *event_wait_list,
301 cl_event *event)
302{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100303 arm_compute::CLSymbols::get().load_default();
304 auto func = arm_compute::CLSymbols::get().clEnqueueReadBuffer;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100305 if(func != nullptr)
306 {
307 return func(command_queue, buffer, blocking_read, offset, size, ptr, num_events_in_wait_list, event_wait_list, event);
308 }
309 else
310 {
311 return CL_OUT_OF_RESOURCES;
312 }
313}
314
315cl_int clGetProgramBuildInfo(
316 cl_program program,
317 cl_device_id device,
318 cl_program_build_info param_name,
319 size_t param_value_size,
320 void *param_value,
321 size_t *param_value_size_ret)
322{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100323 arm_compute::CLSymbols::get().load_default();
324 auto func = arm_compute::CLSymbols::get().clGetProgramBuildInfo;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100325 if(func != nullptr)
326 {
327 return func(program, device, param_name, param_value_size, param_value, param_value_size_ret);
328 }
329 else
330 {
331 return CL_OUT_OF_RESOURCES;
332 }
333}
334
335cl_int clRetainProgram(cl_program program)
336{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100337 arm_compute::CLSymbols::get().load_default();
338 auto func = arm_compute::CLSymbols::get().clRetainProgram;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100339 if(func != nullptr)
340 {
341 return func(program);
342 }
343 else
344 {
345 return CL_OUT_OF_RESOURCES;
346 }
347}
348
349void *clEnqueueMapBuffer(
350 cl_command_queue command_queue,
351 cl_mem buffer,
352 cl_bool blocking_map,
353 cl_map_flags map_flags,
354 size_t offset,
355 size_t size,
356 cl_uint num_events_in_wait_list,
357 const cl_event *event_wait_list,
358 cl_event *event,
359 cl_int *errcode_ret)
360{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100361 arm_compute::CLSymbols::get().load_default();
362 auto func = arm_compute::CLSymbols::get().clEnqueueMapBuffer;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100363 if(func != nullptr)
364 {
365 return func(command_queue, buffer, blocking_map, map_flags, offset, size, num_events_in_wait_list, event_wait_list, event, errcode_ret);
366 }
367 else
368 {
369 if(errcode_ret != nullptr)
370 {
371 *errcode_ret = CL_OUT_OF_RESOURCES;
372 }
373 return nullptr;
374 }
375}
376
377cl_int clReleaseCommandQueue(cl_command_queue command_queue)
378{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100379 arm_compute::CLSymbols::get().load_default();
380 auto func = arm_compute::CLSymbols::get().clReleaseCommandQueue;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100381 if(func != nullptr)
382 {
383 return func(command_queue);
384 }
385 else
386 {
387 return CL_OUT_OF_RESOURCES;
388 }
389}
390
391cl_program clCreateProgramWithBinary(
392 cl_context context,
393 cl_uint num_devices,
394 const cl_device_id *device_list,
395 const size_t *lengths,
396 const unsigned char **binaries,
397 cl_int *binary_status,
398 cl_int *errcode_ret)
399{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100400 arm_compute::CLSymbols::get().load_default();
401 auto func = arm_compute::CLSymbols::get().clCreateProgramWithBinary;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100402 if(func != nullptr)
403 {
404 return func(context, num_devices, device_list, lengths, binaries, binary_status, errcode_ret);
405 }
406 else
407 {
408 if(errcode_ret != nullptr)
409 {
410 *errcode_ret = CL_OUT_OF_RESOURCES;
411 }
412 return nullptr;
413 }
414}
415
416cl_int clRetainContext(cl_context context)
417{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100418 arm_compute::CLSymbols::get().load_default();
419 auto func = arm_compute::CLSymbols::get().clRetainContext;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100420 if(func != nullptr)
421 {
422 return func(context);
423 }
424 else
425 {
426 return CL_OUT_OF_RESOURCES;
427 }
428}
429
430cl_int clReleaseProgram(cl_program program)
431{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100432 arm_compute::CLSymbols::get().load_default();
433 auto func = arm_compute::CLSymbols::get().clReleaseProgram;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100434 if(func != nullptr)
435 {
436 return func(program);
437 }
438 else
439 {
440 return CL_OUT_OF_RESOURCES;
441 }
442}
443
444cl_int clFlush(cl_command_queue command_queue)
445{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100446 arm_compute::CLSymbols::get().load_default();
447 auto func = arm_compute::CLSymbols::get().clFlush;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100448 if(func != nullptr)
449 {
450 return func(command_queue);
451 }
452 else
453 {
454 return CL_OUT_OF_RESOURCES;
455 }
456}
457
Gian Marco Iodice63d76a72017-08-11 11:56:52 +0100458cl_int clFinish(cl_command_queue command_queue)
459{
460 arm_compute::CLSymbols::get().load_default();
461 auto func = arm_compute::CLSymbols::get().clFinish;
462 if(func != nullptr)
463 {
464 return func(command_queue);
465 }
466 else
467 {
468 return CL_OUT_OF_RESOURCES;
469 }
470}
471
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100472cl_int clGetProgramInfo(
473 cl_program program,
474 cl_program_info param_name,
475 size_t param_value_size,
476 void *param_value,
477 size_t *param_value_size_ret)
478{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100479 arm_compute::CLSymbols::get().load_default();
480 auto func = arm_compute::CLSymbols::get().clGetProgramInfo;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100481 if(func != nullptr)
482 {
483 return func(program, param_name, param_value_size, param_value, param_value_size_ret);
484 }
485 else
486 {
487 return CL_OUT_OF_RESOURCES;
488 }
489}
490
491cl_kernel clCreateKernel(
492 cl_program program,
493 const char *kernel_name,
494 cl_int *errcode_ret)
495{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100496 arm_compute::CLSymbols::get().load_default();
497 auto func = arm_compute::CLSymbols::get().clCreateKernel;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100498 if(func != nullptr)
499 {
500 return func(program, kernel_name, errcode_ret);
501 }
502 else
503 {
504 if(errcode_ret != nullptr)
505 {
506 *errcode_ret = CL_OUT_OF_RESOURCES;
507 }
508 return nullptr;
509 }
510}
511
512cl_int clRetainKernel(cl_kernel kernel)
513{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100514 arm_compute::CLSymbols::get().load_default();
515 auto func = arm_compute::CLSymbols::get().clRetainKernel;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100516 if(func != nullptr)
517 {
518 return func(kernel);
519 }
520 else
521 {
522 return CL_OUT_OF_RESOURCES;
523 }
524}
525
526cl_mem clCreateBuffer(
527 cl_context context,
528 cl_mem_flags flags,
529 size_t size,
530 void *host_ptr,
531 cl_int *errcode_ret)
532{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100533 arm_compute::CLSymbols::get().load_default();
534 auto func = arm_compute::CLSymbols::get().clCreateBuffer;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100535 if(func != nullptr)
536 {
537 return func(context, flags, size, host_ptr, errcode_ret);
538 }
539 else
540 {
541 if(errcode_ret != nullptr)
542 {
543 *errcode_ret = CL_OUT_OF_RESOURCES;
544 }
545 return nullptr;
546 }
547}
548
549cl_program clCreateProgramWithSource(
550 cl_context context,
551 cl_uint count,
552 const char **strings,
553 const size_t *lengths,
554 cl_int *errcode_ret)
555{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100556 arm_compute::CLSymbols::get().load_default();
557 auto func = arm_compute::CLSymbols::get().clCreateProgramWithSource;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100558 if(func != nullptr)
559 {
560 return func(context, count, strings, lengths, errcode_ret);
561 }
562 else
563 {
564 if(errcode_ret != nullptr)
565 {
566 *errcode_ret = CL_OUT_OF_RESOURCES;
567 }
568 return nullptr;
569 }
570}
571
572cl_int clReleaseKernel(cl_kernel kernel)
573{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100574 arm_compute::CLSymbols::get().load_default();
575 auto func = arm_compute::CLSymbols::get().clReleaseKernel;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100576 if(func != nullptr)
577 {
578 return func(kernel);
579 }
580 else
581 {
582 return CL_OUT_OF_RESOURCES;
583 }
584}
585
586cl_int clGetDeviceIDs(cl_platform_id platform,
587 cl_device_type device_type,
588 cl_uint num_entries,
589 cl_device_id *devices,
590 cl_uint *num_devices)
591{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100592 arm_compute::CLSymbols::get().load_default();
593 auto func = arm_compute::CLSymbols::get().clGetDeviceIDs;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100594 if(func != nullptr)
595 {
596 return func(platform, device_type, num_entries, devices, num_devices);
597 }
598 else
599 {
600 return CL_OUT_OF_RESOURCES;
601 }
602}
603
604cl_int clGetDeviceInfo(cl_device_id device,
605 cl_device_info param_name,
606 size_t param_value_size,
607 void *param_value,
608 size_t *param_value_size_ret)
609{
Moritz Pflanzer725788e2017-07-07 15:35:56 +0100610 arm_compute::CLSymbols::get().load_default();
611 auto func = arm_compute::CLSymbols::get().clGetDeviceInfo;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100612 if(func != nullptr)
613 {
614 return func(device, param_name, param_value_size, param_value, param_value_size_ret);
615 }
616 else
617 {
618 return CL_OUT_OF_RESOURCES;
619 }
620}
Giorgio Arena9fe41442017-08-23 16:36:24 +0100621
622cl_int clRetainEvent(cl_event event)
623{
Moritz Pflanzer159b6da2017-09-20 16:03:35 +0100624 arm_compute::CLSymbols::get().load_default();
Giorgio Arena9fe41442017-08-23 16:36:24 +0100625 auto func = arm_compute::CLSymbols::get().clRetainEvent;
626 if(func != nullptr)
627 {
628 return func(event);
629 }
630 else
631 {
632 return CL_OUT_OF_RESOURCES;
633 }
634}