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));
135 #define LOAD_EXTENSION_FUNCTION_PTR(func_name, platform_id) \
137 reinterpret_cast<decltype(func_name) *>(clGetExtensionFunctionAddressForPlatform(platform_id, #func_name));
197 constexpr
unsigned int num_platforms = 1
U;
198 std::vector<cl_platform_id> platform_ids(num_platforms);
200 if (err != CL_SUCCESS)
225 #undef LOAD_FUNCTION_PTR
226 #undef LOAD_EXTENSION_FUNCTION_PTR
231 _loaded = std::make_pair(
true,
true);
266 return func(command_queue, event);
270 return CL_OUT_OF_RESOURCES;
280 return func(num_events, event_list);
284 return CL_OUT_OF_RESOURCES;
289 cl_bool blocking_map,
293 cl_uint num_events_in_wait_list,
294 const cl_event *event_wait_list,
301 return func(command_queue, blocking_map, flags, svm_ptr, size, num_events_in_wait_list, event_wait_list, event);
305 return CL_OUT_OF_RESOURCES;
311 cl_uint num_events_in_wait_list,
312 const cl_event *event_wait_list,
319 return func(command_queue, svm_ptr, num_events_in_wait_list, event_wait_list, event);
323 return CL_OUT_OF_RESOURCES;
327 void *
clSVMAlloc(cl_context
context, cl_svm_mem_flags_arm flags,
size_t size, cl_uint alignment)
333 return func(
context, flags, size, alignment);
352 cl_context_info param_name,
353 size_t param_value_size,
355 size_t *param_value_size_ret)
361 return func(
context, param_name, param_value_size, param_value, param_value_size_ret);
365 return CL_OUT_OF_RESOURCES;
371 cl_command_queue_properties properties,
378 return func(
context, device, properties, errcode_ret);
388 const cl_queue_properties *properties,
395 return func(
context, device, properties, errcode_ret);
405 const cl_device_id *devices,
406 void (*pfn_notify)(
const char *,
const void *,
size_t,
void *),
414 return func(properties, num_devices, devices, pfn_notify, user_data, errcode_ret);
423 cl_device_type device_type,
424 void (*pfn_notify)(
const char *,
const void *,
size_t,
void *),
432 return func(properties, device_type, pfn_notify, user_data, errcode_ret);
442 const cl_device_id *device_list,
444 void(CL_CALLBACK *pfn_notify)(cl_program program,
void *user_data),
451 return func(program, num_devices, device_list, options, pfn_notify, user_data);
455 return CL_OUT_OF_RESOURCES;
462 const size_t *global_work_offset,
463 const size_t *global_work_size,
464 const size_t *local_work_size,
465 cl_uint num_events_in_wait_list,
466 const cl_event *event_wait_list,
473 return func(command_queue, kernel, work_dim, global_work_offset, global_work_size, local_work_size,
474 num_events_in_wait_list, event_wait_list, event);
478 return CL_OUT_OF_RESOURCES;
482 cl_int
clSetKernelArg(cl_kernel kernel, cl_uint arg_index,
size_t arg_size,
const void *arg_value)
488 return func(kernel, arg_index, arg_size, arg_value);
492 return CL_OUT_OF_RESOURCES;
506 return CL_OUT_OF_RESOURCES;
520 return CL_OUT_OF_RESOURCES;
527 cl_uint num_events_in_wait_list,
528 const cl_event *event_wait_list,
535 return func(command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
539 return CL_OUT_OF_RESOURCES;
549 return func(command_queue);
553 return CL_OUT_OF_RESOURCES;
567 return CL_OUT_OF_RESOURCES;
580 return CL_OUT_OF_RESOURCES;
586 cl_bool blocking_write,
590 cl_uint num_events_in_wait_list,
591 const cl_event *event_wait_list,
598 return func(command_queue, buffer, blocking_write,
offset, size, ptr, num_events_in_wait_list, event_wait_list,
603 return CL_OUT_OF_RESOURCES;
609 cl_bool blocking_read,
613 cl_uint num_events_in_wait_list,
614 const cl_event *event_wait_list,
621 return func(command_queue, buffer, blocking_read,
offset, size, ptr, num_events_in_wait_list, event_wait_list,
626 return CL_OUT_OF_RESOURCES;
632 cl_program_build_info param_name,
633 size_t param_value_size,
635 size_t *param_value_size_ret)
641 return func(program, device, param_name, param_value_size, param_value, param_value_size_ret);
645 return CL_OUT_OF_RESOURCES;
655 return func(program);
659 return CL_OUT_OF_RESOURCES;
665 cl_bool blocking_map,
666 cl_map_flags map_flags,
669 cl_uint num_events_in_wait_list,
670 const cl_event *event_wait_list,
678 return func(command_queue, buffer, blocking_map, map_flags,
offset, size, num_events_in_wait_list,
679 event_wait_list, event, errcode_ret);
683 if (errcode_ret !=
nullptr)
685 *errcode_ret = CL_OUT_OF_RESOURCES;
697 return func(command_queue);
701 return CL_OUT_OF_RESOURCES;
707 const cl_device_id *device_list,
708 const size_t *lengths,
709 const unsigned char **binaries,
710 cl_int *binary_status,
717 return func(
context, num_devices, device_list, lengths, binaries, binary_status, errcode_ret);
721 if (errcode_ret !=
nullptr)
723 *errcode_ret = CL_OUT_OF_RESOURCES;
739 return CL_OUT_OF_RESOURCES;
749 return func(program);
753 return CL_OUT_OF_RESOURCES;
757 cl_int
clFlush(cl_command_queue command_queue)
763 return func(command_queue);
767 return CL_OUT_OF_RESOURCES;
777 return func(command_queue);
781 return CL_OUT_OF_RESOURCES;
786 cl_program_info param_name,
787 size_t param_value_size,
789 size_t *param_value_size_ret)
795 return func(program, param_name, param_value_size, param_value, param_value_size_ret);
799 return CL_OUT_OF_RESOURCES;
813 if (errcode_ret !=
nullptr)
815 *errcode_ret = CL_OUT_OF_RESOURCES;
831 return CL_OUT_OF_RESOURCES;
841 return func(
context, flags, size, host_ptr, errcode_ret);
845 if (errcode_ret !=
nullptr)
847 *errcode_ret = CL_OUT_OF_RESOURCES;
854 cl_context
context, cl_uint count,
const char **strings,
const size_t *lengths, cl_int *errcode_ret)
860 return func(
context, count, strings, lengths, errcode_ret);
864 if (errcode_ret !=
nullptr)
866 *errcode_ret = CL_OUT_OF_RESOURCES;
882 return CL_OUT_OF_RESOURCES;
887 cl_device_type device_type,
889 cl_device_id *devices,
890 cl_uint *num_devices)
896 return func(platform, device_type, num_entries, devices, num_devices);
900 return CL_OUT_OF_RESOURCES;
905 cl_device_info param_name,
906 size_t param_value_size,
908 size_t *param_value_size_ret)
914 return func(device, param_name, param_value_size, param_value, param_value_size_ret);
918 return CL_OUT_OF_RESOURCES;
923 cl_mem memobj, cl_mem_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret)
929 return func(memobj, param_name, param_value_size, param_value, param_value_size_ret);
933 return CL_OUT_OF_RESOURCES;
947 return CL_OUT_OF_RESOURCES;
952 cl_platform_info param_name,
953 size_t param_value_size,
955 size_t *param_value_size_ret)
961 return func(platform, param_name, param_value_size, param_value, param_value_size_ret);
965 return CL_OUT_OF_RESOURCES;
969 cl_int
clGetPlatformIDs(cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms)
975 return func(num_entries, platforms, num_platforms);
979 return CL_OUT_OF_RESOURCES;
985 cl_kernel_work_group_info param_name,
986 size_t param_value_size,
988 size_t *param_value_size_ret)
994 return func(kernel, device, param_name, param_value_size, param_value, param_value_size_ret);
998 return CL_OUT_OF_RESOURCES;
1003 cl_command_queue_info param_name,
1004 size_t param_value_size,
1006 size_t *param_value_size_ret)
1010 if (func !=
nullptr)
1012 return func(command_queue, param_name, param_value_size, param_value, param_value_size_ret);
1016 return CL_OUT_OF_RESOURCES;
1021 cl_kernel_info param_name,
1022 size_t param_value_size,
1024 size_t *param_value_size_ret)
1028 if (func !=
nullptr)
1030 return func(kernel, param_name, param_value_size, param_value, param_value_size_ret);
1034 return CL_OUT_OF_RESOURCES;
1039 cl_profiling_info param_name,
1040 size_t param_value_size,
1042 size_t *param_value_size_ret)
1046 if (func !=
nullptr)
1048 return func(event, param_name, param_value_size, param_value, param_value_size_ret);
1052 return CL_OUT_OF_RESOURCES;
1058 const cl_image_format *image_format,
1059 const cl_image_desc *image_desc,
1061 cl_int *errcode_ret)
1065 if (func !=
nullptr)
1067 return func(
context, flags, image_format, image_desc, host_ptr, errcode_ret);
1071 if (errcode_ret !=
nullptr)
1073 *errcode_ret = CL_OUT_OF_RESOURCES;
1080 clSetKernelExecInfo(cl_kernel kernel, cl_kernel_exec_info param_name,
size_t param_value_size,
const void *param_value)
1084 if (func !=
nullptr)
1086 return func(kernel, param_name, param_value_size, param_value);
1090 return CL_OUT_OF_RESOURCES;
1099 if (func !=
nullptr)
1101 return func(platform, funcname);
1108 const cl_command_queue *queues,
1109 const cl_command_buffer_properties_khr *properties,
1110 cl_int *errcode_ret)
1115 if (func !=
nullptr)
1117 return func(num_queues, queues, properties, errcode_ret);
1121 if (errcode_ret !=
nullptr)
1123 *errcode_ret = CL_INVALID_OPERATION;
1135 if (func !=
nullptr)
1137 return func(command_buffer);
1141 return CL_INVALID_OPERATION;
1150 if (func !=
nullptr)
1152 return func(command_buffer);
1156 return CL_INVALID_OPERATION;
1165 if (func !=
nullptr)
1167 return func(command_buffer);
1171 return CL_INVALID_OPERATION;
1176 cl_command_queue *queues,
1177 cl_command_buffer_khr command_buffer,
1178 cl_uint num_events_in_wait_list,
1179 const cl_event *event_wait_list,
1185 if (func !=
nullptr)
1187 return func(num_queues, queues, command_buffer, num_events_in_wait_list, event_wait_list, event);
1191 return CL_INVALID_OPERATION;
1196 cl_command_queue command_queue,
1197 const cl_ndrange_kernel_command_properties_khr *properties,
1200 const size_t *global_work_offset,
1201 const size_t *global_work_size,
1202 const size_t *local_work_size,
1203 cl_uint num_sync_points_in_wait_list,
1204 const cl_sync_point_khr *sync_point_wait_list,
1205 cl_sync_point_khr *sync_point,
1206 cl_mutable_command_khr *mutable_handle)
1211 if (func !=
nullptr)
1213 return func(command_buffer, command_queue, properties, kernel, work_dim, global_work_offset, global_work_size,
1214 local_work_size, num_sync_points_in_wait_list, sync_point_wait_list, sync_point, mutable_handle);
1218 return CL_INVALID_OPERATION;
1223 const cl_mutable_base_config_khr *mutable_config)
1228 if (func !=
nullptr)
1230 return func(command_buffer, mutable_config);
1234 return CL_INVALID_OPERATION;
1240 const cl_import_properties_arm *properties,
1243 cl_int *errcode_ret)
1247 if (func !=
nullptr)
1249 return func(
context, flags, properties, memory, size, errcode_ret);
1253 if (errcode_ret !=
nullptr)
1255 *errcode_ret = CL_OUT_OF_RESOURCES;