25 #pragma GCC diagnostic push
26 #pragma GCC diagnostic ignored "-Wunused-parameter"
28 #pragma GCC diagnostic pop
51 static const std::vector<std::string> libraries_filenames{
"libOpenCL.so",
"libGLES_mali.so",
"libmali.so"};
55 return _loaded.second;
61 if (
load(libraries_filenames,
false))
64 "Failed to load OpenCL symbols from shared library");
70 static const std::vector<std::string> android_libraries_filenames{
"libOpenCL-pixel.so",
"libOpenCL-car.so"};
72 if (
load(android_libraries_filenames,
true))
75 "Failed to load OpenCL symbols from android shared library");
82 std::for_each(libraries_filenames.begin(), libraries_filenames.end(),
83 [&
ss](
const std::string &s) { ss << s <<
" "; });
85 std::for_each(android_libraries_filenames.begin(), android_libraries_filenames.end(),
86 [&
ss](
const std::string &s) { ss << s <<
" "; });
88 std::cerr <<
"Couldn't find any of the following OpenCL library: " <<
ss.str() << std::endl;
92 bool CLSymbols::load(
const std::vector<std::string> &libraries_filenames,
bool use_loader)
94 void *handle =
nullptr;
95 unsigned int index = 0;
96 for (index = 0; index < libraries_filenames.size(); ++index)
98 handle = dlopen(libraries_filenames[index].c_str(), RTLD_LAZY | RTLD_LOCAL);
99 if (handle !=
nullptr)
104 if (index == libraries_filenames.size())
107 _loaded.second =
false;
112 typedef void *(*loadOpenCLPointer_t)(
const char *
name);
113 loadOpenCLPointer_t loadOpenCLPointer;
116 typedef void (*enableOpenCL_t)();
117 enableOpenCL_t enableOpenCL =
reinterpret_cast<enableOpenCL_t
>(dlsym(handle,
"enableOpenCL"));
120 loadOpenCLPointer =
reinterpret_cast<loadOpenCLPointer_t
>(dlsym(handle,
"loadOpenCLPointer"));
124 loadOpenCLPointer =
nullptr;
126 #define LOAD_FUNCTION_PTR(func_name, _handle) \
127 func_name##_ptr = reinterpret_cast<decltype(func_name) *>(use_loader ? loadOpenCLPointer(#func_name) \
128 : dlsym(handle, #func_name));
131 #define LOAD_FUNCTION_PTR(func_name, handle) \
132 func_name##_ptr = reinterpret_cast<decltype(func_name) *>(dlsym(handle, #func_name));
198 #undef LOAD_FUNCTION_PTR
203 _loaded = std::make_pair(
true,
true);
238 return func(command_queue, event);
242 return CL_OUT_OF_RESOURCES;
252 return func(num_events, event_list);
256 return CL_OUT_OF_RESOURCES;
261 cl_bool blocking_map,
265 cl_uint num_events_in_wait_list,
266 const cl_event *event_wait_list,
273 return func(command_queue, blocking_map, flags, svm_ptr, size, num_events_in_wait_list, event_wait_list, event);
277 return CL_OUT_OF_RESOURCES;
283 cl_uint num_events_in_wait_list,
284 const cl_event *event_wait_list,
291 return func(command_queue, svm_ptr, num_events_in_wait_list, event_wait_list, event);
295 return CL_OUT_OF_RESOURCES;
299 void *
clSVMAlloc(cl_context
context, cl_svm_mem_flags_arm flags,
size_t size, cl_uint alignment)
305 return func(
context, flags, size, alignment);
324 cl_context_info param_name,
325 size_t param_value_size,
327 size_t *param_value_size_ret)
333 return func(
context, param_name, param_value_size, param_value, param_value_size_ret);
337 return CL_OUT_OF_RESOURCES;
343 cl_command_queue_properties properties,
350 return func(
context, device, properties, errcode_ret);
360 const cl_queue_properties *properties,
367 return func(
context, device, properties, errcode_ret);
377 const cl_device_id *devices,
378 void (*pfn_notify)(
const char *,
const void *,
size_t,
void *),
386 return func(properties, num_devices, devices, pfn_notify, user_data, errcode_ret);
395 cl_device_type device_type,
396 void (*pfn_notify)(
const char *,
const void *,
size_t,
void *),
404 return func(properties, device_type, pfn_notify, user_data, errcode_ret);
414 const cl_device_id *device_list,
416 void(CL_CALLBACK *pfn_notify)(cl_program program,
void *user_data),
423 return func(program, num_devices, device_list, options, pfn_notify, user_data);
427 return CL_OUT_OF_RESOURCES;
434 const size_t *global_work_offset,
435 const size_t *global_work_size,
436 const size_t *local_work_size,
437 cl_uint num_events_in_wait_list,
438 const cl_event *event_wait_list,
445 return func(command_queue, kernel, work_dim, global_work_offset, global_work_size, local_work_size,
446 num_events_in_wait_list, event_wait_list, event);
450 return CL_OUT_OF_RESOURCES;
454 cl_int
clSetKernelArg(cl_kernel kernel, cl_uint arg_index,
size_t arg_size,
const void *arg_value)
460 return func(kernel, arg_index, arg_size, arg_value);
464 return CL_OUT_OF_RESOURCES;
478 return CL_OUT_OF_RESOURCES;
492 return CL_OUT_OF_RESOURCES;
499 cl_uint num_events_in_wait_list,
500 const cl_event *event_wait_list,
507 return func(command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
511 return CL_OUT_OF_RESOURCES;
521 return func(command_queue);
525 return CL_OUT_OF_RESOURCES;
539 return CL_OUT_OF_RESOURCES;
552 return CL_OUT_OF_RESOURCES;
558 cl_bool blocking_write,
562 cl_uint num_events_in_wait_list,
563 const cl_event *event_wait_list,
570 return func(command_queue, buffer, blocking_write,
offset, size, ptr, num_events_in_wait_list, event_wait_list,
575 return CL_OUT_OF_RESOURCES;
581 cl_bool blocking_read,
585 cl_uint num_events_in_wait_list,
586 const cl_event *event_wait_list,
593 return func(command_queue, buffer, blocking_read,
offset, size, ptr, num_events_in_wait_list, event_wait_list,
598 return CL_OUT_OF_RESOURCES;
604 cl_program_build_info param_name,
605 size_t param_value_size,
607 size_t *param_value_size_ret)
613 return func(program, device, param_name, param_value_size, param_value, param_value_size_ret);
617 return CL_OUT_OF_RESOURCES;
627 return func(program);
631 return CL_OUT_OF_RESOURCES;
637 cl_bool blocking_map,
638 cl_map_flags map_flags,
641 cl_uint num_events_in_wait_list,
642 const cl_event *event_wait_list,
650 return func(command_queue, buffer, blocking_map, map_flags,
offset, size, num_events_in_wait_list,
651 event_wait_list, event, errcode_ret);
655 if (errcode_ret !=
nullptr)
657 *errcode_ret = CL_OUT_OF_RESOURCES;
669 return func(command_queue);
673 return CL_OUT_OF_RESOURCES;
679 const cl_device_id *device_list,
680 const size_t *lengths,
681 const unsigned char **binaries,
682 cl_int *binary_status,
689 return func(
context, num_devices, device_list, lengths, binaries, binary_status, errcode_ret);
693 if (errcode_ret !=
nullptr)
695 *errcode_ret = CL_OUT_OF_RESOURCES;
711 return CL_OUT_OF_RESOURCES;
721 return func(program);
725 return CL_OUT_OF_RESOURCES;
729 cl_int
clFlush(cl_command_queue command_queue)
735 return func(command_queue);
739 return CL_OUT_OF_RESOURCES;
749 return func(command_queue);
753 return CL_OUT_OF_RESOURCES;
758 cl_program_info param_name,
759 size_t param_value_size,
761 size_t *param_value_size_ret)
767 return func(program, param_name, param_value_size, param_value, param_value_size_ret);
771 return CL_OUT_OF_RESOURCES;
785 if (errcode_ret !=
nullptr)
787 *errcode_ret = CL_OUT_OF_RESOURCES;
803 return CL_OUT_OF_RESOURCES;
813 return func(
context, flags, size, host_ptr, errcode_ret);
817 if (errcode_ret !=
nullptr)
819 *errcode_ret = CL_OUT_OF_RESOURCES;
826 cl_context
context, cl_uint count,
const char **strings,
const size_t *lengths, cl_int *errcode_ret)
832 return func(
context, count, strings, lengths, errcode_ret);
836 if (errcode_ret !=
nullptr)
838 *errcode_ret = CL_OUT_OF_RESOURCES;
854 return CL_OUT_OF_RESOURCES;
859 cl_device_type device_type,
861 cl_device_id *devices,
862 cl_uint *num_devices)
868 return func(platform, device_type, num_entries, devices, num_devices);
872 return CL_OUT_OF_RESOURCES;
877 cl_device_info param_name,
878 size_t param_value_size,
880 size_t *param_value_size_ret)
886 return func(device, param_name, param_value_size, param_value, param_value_size_ret);
890 return CL_OUT_OF_RESOURCES;
895 cl_mem memobj, cl_mem_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret)
901 return func(memobj, param_name, param_value_size, param_value, param_value_size_ret);
905 return CL_OUT_OF_RESOURCES;
919 return CL_OUT_OF_RESOURCES;
924 cl_platform_info param_name,
925 size_t param_value_size,
927 size_t *param_value_size_ret)
933 return func(platform, param_name, param_value_size, param_value, param_value_size_ret);
937 return CL_OUT_OF_RESOURCES;
941 cl_int
clGetPlatformIDs(cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms)
947 return func(num_entries, platforms, num_platforms);
951 return CL_OUT_OF_RESOURCES;
957 cl_kernel_work_group_info param_name,
958 size_t param_value_size,
960 size_t *param_value_size_ret)
966 return func(kernel, device, param_name, param_value_size, param_value, param_value_size_ret);
970 return CL_OUT_OF_RESOURCES;
975 cl_command_queue_info param_name,
976 size_t param_value_size,
978 size_t *param_value_size_ret)
984 return func(command_queue, param_name, param_value_size, param_value, param_value_size_ret);
988 return CL_OUT_OF_RESOURCES;
993 cl_kernel_info param_name,
994 size_t param_value_size,
996 size_t *param_value_size_ret)
1000 if (func !=
nullptr)
1002 return func(kernel, param_name, param_value_size, param_value, param_value_size_ret);
1006 return CL_OUT_OF_RESOURCES;
1011 cl_profiling_info param_name,
1012 size_t param_value_size,
1014 size_t *param_value_size_ret)
1018 if (func !=
nullptr)
1020 return func(event, param_name, param_value_size, param_value, param_value_size_ret);
1024 return CL_OUT_OF_RESOURCES;
1030 const cl_image_format *image_format,
1031 const cl_image_desc *image_desc,
1033 cl_int *errcode_ret)
1037 if (func !=
nullptr)
1039 return func(
context, flags, image_format, image_desc, host_ptr, errcode_ret);
1043 if (errcode_ret !=
nullptr)
1045 *errcode_ret = CL_OUT_OF_RESOURCES;
1052 clSetKernelExecInfo(cl_kernel kernel, cl_kernel_exec_info param_name,
size_t param_value_size,
const void *param_value)
1056 if (func !=
nullptr)
1058 return func(kernel, param_name, param_value_size, param_value);
1062 return CL_OUT_OF_RESOURCES;
1067 const cl_command_queue *queues,
1068 const cl_command_buffer_properties_khr *properties,
1069 cl_int *errcode_ret)
1074 if (func !=
nullptr)
1076 return func(num_queues, queues, properties, errcode_ret);
1080 if (errcode_ret !=
nullptr)
1082 *errcode_ret = CL_INVALID_OPERATION;
1094 if (func !=
nullptr)
1096 return func(command_buffer);
1100 return CL_INVALID_OPERATION;
1109 if (func !=
nullptr)
1111 return func(command_buffer);
1115 return CL_INVALID_OPERATION;
1124 if (func !=
nullptr)
1126 return func(command_buffer);
1130 return CL_INVALID_OPERATION;
1135 cl_command_queue *queues,
1136 cl_command_buffer_khr command_buffer,
1137 cl_uint num_events_in_wait_list,
1138 const cl_event *event_wait_list,
1144 if (func !=
nullptr)
1146 return func(num_queues, queues, command_buffer, num_events_in_wait_list, event_wait_list, event);
1150 return CL_INVALID_OPERATION;
1155 cl_command_queue command_queue,
1156 const cl_ndrange_kernel_command_properties_khr *properties,
1159 const size_t *global_work_offset,
1160 const size_t *global_work_size,
1161 const size_t *local_work_size,
1162 cl_uint num_sync_points_in_wait_list,
1163 const cl_sync_point_khr *sync_point_wait_list,
1164 cl_sync_point_khr *sync_point,
1165 cl_mutable_command_khr *mutable_handle)
1170 if (func !=
nullptr)
1172 return func(command_buffer, command_queue, properties, kernel, work_dim, global_work_offset, global_work_size,
1173 local_work_size, num_sync_points_in_wait_list, sync_point_wait_list, sync_point, mutable_handle);
1177 return CL_INVALID_OPERATION;
1182 const cl_mutable_base_config_khr *mutable_config)
1187 if (func !=
nullptr)
1189 return func(command_buffer, mutable_config);
1193 return CL_INVALID_OPERATION;
1199 const cl_import_properties_arm *properties,
1202 cl_int *errcode_ret)
1206 if (func !=
nullptr)
1208 return func(
context, flags, properties, memory, size, errcode_ret);
1212 if (errcode_ret !=
nullptr)
1214 *errcode_ret = CL_OUT_OF_RESOURCES;