summaryrefslogtreecommitdiff
path: root/libs/ARMComputeEx/src/core/CL/OpenCLEx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ARMComputeEx/src/core/CL/OpenCLEx.cpp')
-rw-r--r--libs/ARMComputeEx/src/core/CL/OpenCLEx.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/libs/ARMComputeEx/src/core/CL/OpenCLEx.cpp b/libs/ARMComputeEx/src/core/CL/OpenCLEx.cpp
new file mode 100644
index 000000000..cbda169fb
--- /dev/null
+++ b/libs/ARMComputeEx/src/core/CL/OpenCLEx.cpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved
+ * Copyright (c) 2016-2018 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "arm_compute/core/CL/OpenCLEx.h"
+
+#include <dlfcn.h>
+#include <iostream>
+
+namespace arm_compute
+{
+CLSymbolsEx &CLSymbolsEx::get()
+{
+ static CLSymbolsEx symbols;
+ return symbols;
+}
+
+bool CLSymbolsEx::load_default()
+{
+ static const std::vector<std::string> libraries{"libOpenCL.so", "libGLES_mali.so", "libmali.so"};
+
+ if (_loaded.first)
+ {
+ return _loaded.second;
+ }
+
+ // Indicate that default loading has been tried
+ _loaded.first = true;
+
+ for (const auto &lib : libraries)
+ {
+ if (load(lib))
+ {
+ return true;
+ }
+ }
+
+ std::cerr << "Couldn't find any OpenCL library.\n";
+ return false;
+}
+
+bool CLSymbolsEx::load(const std::string &library)
+{
+ void *handle = dlopen(library.c_str(), RTLD_LAZY | RTLD_LOCAL);
+
+ if (handle == nullptr)
+ {
+ std::cerr << "Can't load " << library << ": " << dlerror() << "\n";
+ // Set status of loading to failed
+ _loaded.second = false;
+ return false;
+ }
+
+#define LOAD_FUNCTION_PTR(func_name, handle) \
+ func_name##_ptr = reinterpret_cast<decltype(func_name) *>(dlsym(handle, #func_name));
+
+ LOAD_FUNCTION_PTR(clGetEventInfo, handle);
+ LOAD_FUNCTION_PTR(clSetEventCallback, handle);
+
+#undef LOAD_FUNCTION_PTR
+
+ // Don't call dlclose(handle) or all the symbols will be unloaded !
+
+ // Disable default loading and set status to successful
+ _loaded = std::make_pair(true, true);
+
+ return true;
+}
+
+} // namespace arm_compute
+
+cl_int clGetEventInfo(cl_event event, cl_event_info param_name, size_t param_value_size,
+ void *param_value, size_t *param_value_size_ret)
+{
+ arm_compute::CLSymbolsEx::get().load_default();
+ auto func = arm_compute::CLSymbolsEx::get().clGetEventInfo_ptr;
+ if (func != nullptr)
+ {
+ return func(event, param_name, param_value_size, param_value, param_value_size_ret);
+ }
+ else
+ {
+ return CL_OUT_OF_RESOURCES;
+ }
+}
+
+cl_int clSetEventCallback(cl_event event, cl_int command_exec_callback_type,
+ void(CL_CALLBACK *pfn_ev_notify)(cl_event ev, cl_int ev_cmd_exec_status,
+ void *user_data),
+ void *user_data)
+{
+ arm_compute::CLSymbolsEx::get().load_default();
+ auto func = arm_compute::CLSymbolsEx::get().clSetEventCallback_ptr;
+ if (func != nullptr)
+ {
+ return func(event, command_exec_callback_type, pfn_ev_notify, user_data);
+ }
+ else
+ {
+ return CL_OUT_OF_RESOURCES;
+ }
+}