1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #define USE_OPENCL_WRAPPER
16 #ifdef USE_OPENCL_WRAPPER
17
18 #include "opencl_wrapper.h"
19 #include <algorithm>
20 #include <dlfcn.h>
21 #include <memory>
22 #include <mutex>
23 #include <string>
24 #include <vector>
25 #include <iostream>
26
27 namespace OHOS {
28 // default opencl library path
29 static const std::vector<std::string> g_opencl_library_paths = {
30 #if defined(__APPLE__) || defined(__MACOSX)
31 "libOpenCL.so", "/System/Library/Frameworks/OpenCL.framework/OpenCL"
32 #else
33 "/vendor/lib64/chipsetsdk/libGLES_mali.so",
34 "/system/lib64/libGLES_mali.so",
35 "libGLES_mali.so",
36 "/vendor/lib64/chipsetsdk/libhvgr_v200.so",
37 "/vendor/lib64/passthrough/libhvgr_v200.so",
38 "libhvgr_v200.so",
39 "/vendor/lib64/chipsetsdk/libEGL_impl.so",
40 "/vendor/lib64/passthrough/libEGL_impl.so",
41 "libEGL_impl.so",
42 #endif
43 };
44
45 static std::mutex g_initMutex;
46 static bool g_isInit = false;
47 static bool g_loadSuccess = false;
48 static void *g_handle{nullptr};
49
InitOpenCL()50 bool InitOpenCL()
51 {
52 std::lock_guard<std::mutex> lock(g_initMutex);
53 if (g_isInit) {
54 return g_loadSuccess;
55 }
56 g_isInit = true;
57 g_loadSuccess = LoadOpenCLLibrary(&g_handle);
58 return g_loadSuccess;
59 }
60
UnLoadOpenCLLibrary(void * handle)61 bool UnLoadOpenCLLibrary(void *handle)
62 {
63 if (handle != nullptr) {
64 if (dlclose(handle) != 0) {
65 return false;
66 }
67 return true;
68 }
69 return true;
70 }
71
InitOpenCLExtern(void ** clSoHandle)72 bool InitOpenCLExtern(void **clSoHandle)
73 {
74 if (clSoHandle == nullptr) {
75 return false;
76 }
77 return LoadOpenCLLibrary(clSoHandle);
78 }
79
UnLoadCLExtern(void * clSoHandle)80 bool UnLoadCLExtern(void *clSoHandle)
81 {
82 if (clSoHandle == nullptr) {
83 return false;
84 }
85 if (dlclose(clSoHandle) != 0) {
86 return false;
87 }
88 return true;
89 }
90
LoadLibraryFromPath(const std::string & library_path,void ** handle_ptr)91 static bool LoadLibraryFromPath(const std::string &library_path, void **handle_ptr)
92 {
93 if (handle_ptr == nullptr) {
94 return false;
95 }
96
97 *handle_ptr = dlopen(library_path.c_str(), RTLD_NOW | RTLD_LOCAL);
98 if (*handle_ptr == nullptr) {
99 return false;
100 }
101
102 // load function ptr use dlopen and dlsym.
103 #define LOAD_OPENCL_FUNCTION_PTR(func_name) \
104 func_name = reinterpret_cast<func_name##Func>(dlsym(*handle_ptr, #func_name)); \
105 if (func_name == nullptr) { \
106 return false; \
107 }
108
109 LOAD_OPENCL_FUNCTION_PTR(clGetPlatformIDs);
110 LOAD_OPENCL_FUNCTION_PTR(clGetPlatformInfo);
111 LOAD_OPENCL_FUNCTION_PTR(clBuildProgram);
112 LOAD_OPENCL_FUNCTION_PTR(clEnqueueNDRangeKernel);
113 LOAD_OPENCL_FUNCTION_PTR(clSetKernelArg);
114 LOAD_OPENCL_FUNCTION_PTR(clReleaseKernel);
115 LOAD_OPENCL_FUNCTION_PTR(clCreateProgramWithSource);
116 LOAD_OPENCL_FUNCTION_PTR(clCreateBuffer);
117 LOAD_OPENCL_FUNCTION_PTR(clCreateImage2D);
118 LOAD_OPENCL_FUNCTION_PTR(clCreateImage3D);
119 LOAD_OPENCL_FUNCTION_PTR(clRetainKernel);
120 LOAD_OPENCL_FUNCTION_PTR(clCreateKernel);
121 LOAD_OPENCL_FUNCTION_PTR(clGetProgramInfo);
122 LOAD_OPENCL_FUNCTION_PTR(clFlush);
123 LOAD_OPENCL_FUNCTION_PTR(clFinish);
124 LOAD_OPENCL_FUNCTION_PTR(clReleaseProgram);
125 LOAD_OPENCL_FUNCTION_PTR(clRetainContext);
126 LOAD_OPENCL_FUNCTION_PTR(clGetContextInfo);
127 LOAD_OPENCL_FUNCTION_PTR(clCreateProgramWithBinary);
128 LOAD_OPENCL_FUNCTION_PTR(clCreateCommandQueue);
129 LOAD_OPENCL_FUNCTION_PTR(clGetCommandQueueInfo);
130 LOAD_OPENCL_FUNCTION_PTR(clReleaseCommandQueue);
131 LOAD_OPENCL_FUNCTION_PTR(clEnqueueMapBuffer);
132 LOAD_OPENCL_FUNCTION_PTR(clEnqueueMapImage);
133 LOAD_OPENCL_FUNCTION_PTR(clRetainProgram);
134 LOAD_OPENCL_FUNCTION_PTR(clGetProgramBuildInfo);
135 LOAD_OPENCL_FUNCTION_PTR(clEnqueueReadBuffer);
136 LOAD_OPENCL_FUNCTION_PTR(clEnqueueReadBufferRect);
137 LOAD_OPENCL_FUNCTION_PTR(clEnqueueWriteBuffer);
138 LOAD_OPENCL_FUNCTION_PTR(clEnqueueReadImage);
139 LOAD_OPENCL_FUNCTION_PTR(clEnqueueWriteImage);
140 LOAD_OPENCL_FUNCTION_PTR(clWaitForEvents);
141 LOAD_OPENCL_FUNCTION_PTR(clReleaseEvent);
142 LOAD_OPENCL_FUNCTION_PTR(clCreateContext);
143 LOAD_OPENCL_FUNCTION_PTR(clCreateContextFromType);
144 LOAD_OPENCL_FUNCTION_PTR(clReleaseContext);
145 LOAD_OPENCL_FUNCTION_PTR(clRetainCommandQueue);
146 LOAD_OPENCL_FUNCTION_PTR(clEnqueueUnmapMemObject);
147 LOAD_OPENCL_FUNCTION_PTR(clRetainMemObject);
148 LOAD_OPENCL_FUNCTION_PTR(clReleaseMemObject);
149 LOAD_OPENCL_FUNCTION_PTR(clGetDeviceInfo);
150 LOAD_OPENCL_FUNCTION_PTR(clGetDeviceIDs);
151 LOAD_OPENCL_FUNCTION_PTR(clRetainEvent);
152 LOAD_OPENCL_FUNCTION_PTR(clGetKernelWorkGroupInfo);
153 LOAD_OPENCL_FUNCTION_PTR(clGetEventInfo);
154 LOAD_OPENCL_FUNCTION_PTR(clGetEventProfilingInfo);
155 LOAD_OPENCL_FUNCTION_PTR(clGetImageInfo);
156 LOAD_OPENCL_FUNCTION_PTR(clEnqueueCopyImage);
157 LOAD_OPENCL_FUNCTION_PTR(clEnqueueCopyBufferToImage);
158 LOAD_OPENCL_FUNCTION_PTR(clEnqueueCopyImageToBuffer);
159 #if defined(CL_TARGET_OPENCL_VERSION) && CL_TARGET_OPENCL_VERSION >= 120
160 LOAD_OPENCL_FUNCTION_PTR(clRetainDevice);
161 LOAD_OPENCL_FUNCTION_PTR(clReleaseDevice);
162 LOAD_OPENCL_FUNCTION_PTR(clCreateImage);
163 LOAD_OPENCL_FUNCTION_PTR(clEnqueueFillImage);
164 #endif
165 #if defined(CL_TARGET_OPENCL_VERSION) && CL_TARGET_OPENCL_VERSION >= 200
166 LOAD_OPENCL_FUNCTION_PTR(clCreateCommandQueueWithProperties);
167 LOAD_OPENCL_FUNCTION_PTR(clGetExtensionFunctionAddress);
168 LOAD_OPENCL_FUNCTION_PTR(clSVMAlloc);
169 LOAD_OPENCL_FUNCTION_PTR(clSVMFree);
170 LOAD_OPENCL_FUNCTION_PTR(clEnqueueSVMMap);
171 LOAD_OPENCL_FUNCTION_PTR(clEnqueueSVMUnmap);
172 LOAD_OPENCL_FUNCTION_PTR(clSetKernelArgSVMPointer);
173 #endif
174
175 return true;
176 }
177 // load default library path
LoadOpenCLLibrary(void ** handle_ptr)178 bool LoadOpenCLLibrary(void **handle_ptr)
179 {
180 if (handle_ptr == nullptr) {
181 return false;
182 }
183 auto it =
184 std::find_if(g_opencl_library_paths.begin(), g_opencl_library_paths.end(),
185 [&](const std::string &lib_path) { return OHOS::LoadLibraryFromPath(lib_path, handle_ptr); });
186 if (it != g_opencl_library_paths.end()) {
187 return true;
188 }
189 return false;
190 }
191
192 #define CL_DEFINE_FUNC_PTR(func) func##Func func = nullptr
193
194 CL_DEFINE_FUNC_PTR(clGetPlatformIDs);
195 CL_DEFINE_FUNC_PTR(clGetPlatformInfo);
196 CL_DEFINE_FUNC_PTR(clBuildProgram);
197 CL_DEFINE_FUNC_PTR(clEnqueueNDRangeKernel);
198 CL_DEFINE_FUNC_PTR(clSetKernelArg);
199 CL_DEFINE_FUNC_PTR(clReleaseKernel);
200 CL_DEFINE_FUNC_PTR(clCreateProgramWithSource);
201 CL_DEFINE_FUNC_PTR(clCreateBuffer);
202 CL_DEFINE_FUNC_PTR(clCreateImage2D);
203 CL_DEFINE_FUNC_PTR(clImportMemoryARM);
204 CL_DEFINE_FUNC_PTR(clCreateImage3D);
205 CL_DEFINE_FUNC_PTR(clRetainKernel);
206 CL_DEFINE_FUNC_PTR(clCreateKernel);
207 CL_DEFINE_FUNC_PTR(clGetProgramInfo);
208 CL_DEFINE_FUNC_PTR(clFlush);
209 CL_DEFINE_FUNC_PTR(clFinish);
210 CL_DEFINE_FUNC_PTR(clReleaseProgram);
211 CL_DEFINE_FUNC_PTR(clRetainContext);
212 CL_DEFINE_FUNC_PTR(clGetContextInfo);
213 CL_DEFINE_FUNC_PTR(clCreateProgramWithBinary);
214 CL_DEFINE_FUNC_PTR(clCreateCommandQueue);
215 CL_DEFINE_FUNC_PTR(clGetCommandQueueInfo);
216 CL_DEFINE_FUNC_PTR(clReleaseCommandQueue);
217 CL_DEFINE_FUNC_PTR(clEnqueueMapBuffer);
218 CL_DEFINE_FUNC_PTR(clEnqueueMapImage);
219 CL_DEFINE_FUNC_PTR(clEnqueueCopyImage);
220 CL_DEFINE_FUNC_PTR(clRetainProgram);
221 CL_DEFINE_FUNC_PTR(clGetProgramBuildInfo);
222 CL_DEFINE_FUNC_PTR(clEnqueueReadBuffer);
223 CL_DEFINE_FUNC_PTR(clEnqueueReadBufferRect);
224 CL_DEFINE_FUNC_PTR(clEnqueueWriteBuffer);
225 CL_DEFINE_FUNC_PTR(clEnqueueWriteImage);
226 CL_DEFINE_FUNC_PTR(clEnqueueReadImage);
227 CL_DEFINE_FUNC_PTR(clWaitForEvents);
228 CL_DEFINE_FUNC_PTR(clReleaseEvent);
229 CL_DEFINE_FUNC_PTR(clCreateContext);
230 CL_DEFINE_FUNC_PTR(clCreateContextFromType);
231 CL_DEFINE_FUNC_PTR(clReleaseContext);
232 CL_DEFINE_FUNC_PTR(clRetainCommandQueue);
233 CL_DEFINE_FUNC_PTR(clEnqueueUnmapMemObject);
234 CL_DEFINE_FUNC_PTR(clRetainMemObject);
235 CL_DEFINE_FUNC_PTR(clReleaseMemObject);
236 CL_DEFINE_FUNC_PTR(clGetDeviceInfo);
237 CL_DEFINE_FUNC_PTR(clGetDeviceIDs);
238 CL_DEFINE_FUNC_PTR(clRetainEvent);
239 CL_DEFINE_FUNC_PTR(clGetKernelWorkGroupInfo);
240 CL_DEFINE_FUNC_PTR(clGetEventInfo);
241 CL_DEFINE_FUNC_PTR(clGetEventProfilingInfo);
242 CL_DEFINE_FUNC_PTR(clGetImageInfo);
243 CL_DEFINE_FUNC_PTR(clEnqueueCopyBufferToImage);
244 CL_DEFINE_FUNC_PTR(clEnqueueCopyImageToBuffer);
245 #if defined(CL_TARGET_OPENCL_VERSION) && CL_TARGET_OPENCL_VERSION >= 120
246 CL_DEFINE_FUNC_PTR(clRetainDevice);
247 CL_DEFINE_FUNC_PTR(clReleaseDevice);
248 CL_DEFINE_FUNC_PTR(clCreateImage);
249 CL_DEFINE_FUNC_PTR(clEnqueueFillImage);
250 #endif
251 #if defined(CL_TARGET_OPENCL_VERSION) && CL_TARGET_OPENCL_VERSION >= 200
252 CL_DEFINE_FUNC_PTR(clGetKernelSubGroupInfoKHR);
253 CL_DEFINE_FUNC_PTR(clCreateCommandQueueWithProperties);
254 CL_DEFINE_FUNC_PTR(clGetExtensionFunctionAddress);
255 CL_DEFINE_FUNC_PTR(clCreateProgramWithIL);
256 CL_DEFINE_FUNC_PTR(clSVMAlloc);
257 CL_DEFINE_FUNC_PTR(clSVMFree);
258 CL_DEFINE_FUNC_PTR(clEnqueueSVMMap);
259 CL_DEFINE_FUNC_PTR(clEnqueueSVMUnmap);
260 CL_DEFINE_FUNC_PTR(clSetKernelArgSVMPointer);
261 #endif
262 #undef LOAD_OPENCL_FUNCTION_PTR
263 } // namespace OHOS
264
265 // clGetPlatformIDs wrapper, use OpenCLWrapper function. use OpenCLWrapper function.
clGetPlatformIDs(cl_uint num_entries,cl_platform_id * platforms,cl_uint * num_platforms)266 cl_int clGetPlatformIDs(cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms)
267 {
268 OHOS::InitOpenCL();
269 auto func = OHOS::clGetPlatformIDs;
270 MS_ASSERT(func != nullptr);
271 return func(num_entries, platforms, num_platforms);
272 }
273
274 // clGetPlatformInfo wrapper, use OpenCLWrapper function. use OpenCLWrapper function.
clGetPlatformInfo(cl_platform_id platform,cl_platform_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)275 cl_int clGetPlatformInfo(cl_platform_id platform, cl_platform_info param_name, size_t param_value_size,
276 void *param_value, size_t *param_value_size_ret)
277 {
278 OHOS::InitOpenCL();
279 auto func = OHOS::clGetPlatformInfo;
280 MS_ASSERT(func != nullptr);
281 return func(platform, param_name, param_value_size, param_value, param_value_size_ret);
282 }
283
284 // clGetDeviceIDs wrapper, use OpenCLWrapper function.
clGetDeviceIDs(cl_platform_id platform,cl_device_type device_type,cl_uint num_entries,cl_device_id * devices,cl_uint * num_devices)285 cl_int clGetDeviceIDs(cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices,
286 cl_uint *num_devices)
287 {
288 OHOS::InitOpenCL();
289 auto func = OHOS::clGetDeviceIDs;
290 MS_ASSERT(func != nullptr);
291 return func(platform, device_type, num_entries, devices, num_devices);
292 }
293
294 // clGetDeviceInfo wrapper, use OpenCLWrapper function.
clGetDeviceInfo(cl_device_id device,cl_device_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)295 cl_int clGetDeviceInfo(cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value,
296 size_t *param_value_size_ret)
297 {
298 OHOS::InitOpenCL();
299 auto func = OHOS::clGetDeviceInfo;
300 MS_ASSERT(func != nullptr);
301 return func(device, param_name, param_value_size, param_value, param_value_size_ret);
302 }
303
304 // clCreateContext wrapper, use OpenCLWrapper function.
clCreateContext(const cl_context_properties * properties,cl_uint num_devices,const cl_device_id * devices,void (CL_CALLBACK * pfn_notify)(const char *,const void *,size_t,void *),void * user_data,cl_int * errcode_ret)305 cl_context clCreateContext(const cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices,
306 void(CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *), void *user_data,
307 cl_int *errcode_ret)
308 {
309 OHOS::InitOpenCL();
310 auto func = OHOS::clCreateContext;
311 MS_ASSERT(func != nullptr);
312 return func(properties, num_devices, devices, pfn_notify, user_data, errcode_ret);
313 }
314
315 // clCreateContextFromType wrapper, use OpenCLWrapper function.
clCreateContextFromType(const cl_context_properties * properties,cl_device_type device_type,void (CL_CALLBACK * pfn_notify)(const char *,const void *,size_t,void *),void * user_data,cl_int * errcode_ret)316 cl_context clCreateContextFromType(const cl_context_properties *properties, cl_device_type device_type,
317 void(CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *),
318 void *user_data, cl_int *errcode_ret)
319 {
320 OHOS::InitOpenCL();
321 auto func = OHOS::clCreateContextFromType;
322 MS_ASSERT(func != nullptr);
323 return func(properties, device_type, pfn_notify, user_data, errcode_ret);
324 }
325
326 // clRetainContext wrapper, use OpenCLWrapper function.
clRetainContext(cl_context context)327 cl_int clRetainContext(cl_context context)
328 {
329 OHOS::InitOpenCL();
330 auto func = OHOS::clRetainContext;
331 MS_ASSERT(func != nullptr);
332 return func(context);
333 }
334
335 // clReleaseContext wrapper, use OpenCLWrapper function.
clReleaseContext(cl_context context)336 cl_int clReleaseContext(cl_context context)
337 {
338 OHOS::InitOpenCL();
339 auto func = OHOS::clReleaseContext;
340 MS_ASSERT(func != nullptr);
341 return func(context);
342 }
343
344 // clGetContextInfo wrapper, use OpenCLWrapper function.
clGetContextInfo(cl_context context,cl_context_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)345 cl_int clGetContextInfo(cl_context context, cl_context_info param_name, size_t param_value_size, void *param_value,
346 size_t *param_value_size_ret)
347 {
348 OHOS::InitOpenCL();
349 auto func = OHOS::clGetContextInfo;
350 MS_ASSERT(func != nullptr);
351 return func(context, param_name, param_value_size, param_value, param_value_size_ret);
352 }
353
354 // clCreateProgramWithSource wrapper, use OpenCLWrapper function.
clCreateProgramWithSource(cl_context context,cl_uint count,const char ** strings,const size_t * lengths,cl_int * errcode_ret)355 cl_program clCreateProgramWithSource(cl_context context, cl_uint count, const char **strings, const size_t *lengths,
356 cl_int *errcode_ret)
357 {
358 OHOS::InitOpenCL();
359 auto func = OHOS::clCreateProgramWithSource;
360 MS_ASSERT(func != nullptr);
361 return func(context, count, strings, lengths, errcode_ret);
362 }
363
364 // clCreateProgramWithBinary wrapper, use OpenCLWrapper function.
clCreateProgramWithBinary(cl_context context,cl_uint num_devices,const cl_device_id * devices_list,const size_t * lengths,const unsigned char ** binaries,cl_int * binary_status,cl_int * errcode_ret)365 cl_program clCreateProgramWithBinary(cl_context context, cl_uint num_devices, const cl_device_id *devices_list,
366 const size_t *lengths, const unsigned char **binaries, cl_int *binary_status,
367 cl_int *errcode_ret)
368 {
369 OHOS::InitOpenCL();
370 auto func = OHOS::clCreateProgramWithBinary;
371 MS_ASSERT(func != nullptr);
372 return func(context, num_devices, devices_list, lengths, binaries, binary_status, errcode_ret);
373 }
374
375 // clGetProgramInfo wrapper, use OpenCLWrapper function.
clGetProgramInfo(cl_program program,cl_program_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)376 cl_int clGetProgramInfo(cl_program program, cl_program_info param_name, size_t param_value_size, void *param_value,
377 size_t *param_value_size_ret)
378 {
379 OHOS::InitOpenCL();
380 auto func = OHOS::clGetProgramInfo;
381 MS_ASSERT(func != nullptr);
382 return func(program, param_name, param_value_size, param_value, param_value_size_ret);
383 }
384
385 // clGetProgramBuildInfo wrapper, use OpenCLWrapper function.
clGetProgramBuildInfo(cl_program program,cl_device_id device,cl_program_build_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)386 cl_int clGetProgramBuildInfo(cl_program program, cl_device_id device, cl_program_build_info param_name,
387 size_t param_value_size, void *param_value, size_t *param_value_size_ret)
388 {
389 OHOS::InitOpenCL();
390 auto func = OHOS::clGetProgramBuildInfo;
391 MS_ASSERT(func != nullptr);
392 return func(program, device, param_name, param_value_size, param_value, param_value_size_ret);
393 }
394
395 // clRetainProgram wrapper, use OpenCLWrapper function.
clRetainProgram(cl_program program)396 cl_int clRetainProgram(cl_program program)
397 {
398 OHOS::InitOpenCL();
399 auto func = OHOS::clRetainProgram;
400 MS_ASSERT(func != nullptr);
401 return func(program);
402 }
403
404 // clReleaseProgram wrapper, use OpenCLWrapper function.
clReleaseProgram(cl_program program)405 cl_int clReleaseProgram(cl_program program)
406 {
407 OHOS::InitOpenCL();
408 auto func = OHOS::clReleaseProgram;
409 MS_ASSERT(func != nullptr);
410 return func(program);
411 }
412
413 // clBuildProgram wrapper, use OpenCLWrapper function.
clBuildProgram(cl_program program,cl_uint num_devices,const cl_device_id * device_list,const char * options,void (CL_CALLBACK * pfn_notify)(cl_program program,void * user_data),void * user_data)414 cl_int clBuildProgram(cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options,
415 void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data), void *user_data)
416 {
417 OHOS::InitOpenCL();
418 auto func = OHOS::clBuildProgram;
419 MS_ASSERT(func != nullptr);
420 return func(program, num_devices, device_list, options, pfn_notify, user_data);
421 }
422
423 // clCreateKernel wrapper, use OpenCLWrapper function.
clCreateKernel(cl_program program,const char * kernelName,cl_int * errcode_ret)424 cl_kernel clCreateKernel(cl_program program, const char *kernelName, cl_int *errcode_ret)
425 {
426 OHOS::InitOpenCL();
427 auto func = OHOS::clCreateKernel;
428 MS_ASSERT(func != nullptr);
429 return func(program, kernelName, errcode_ret);
430 }
431
432 // clRetainKernel wrapper, use OpenCLWrapper function.
clRetainKernel(cl_kernel kernel)433 cl_int clRetainKernel(cl_kernel kernel)
434 {
435 OHOS::InitOpenCL();
436 auto func = OHOS::clRetainKernel;
437 MS_ASSERT(func != nullptr);
438 return func(kernel);
439 }
440
441 // clReleaseKernel wrapper, use OpenCLWrapper function.
clReleaseKernel(cl_kernel kernel)442 cl_int clReleaseKernel(cl_kernel kernel)
443 {
444 OHOS::InitOpenCL();
445 auto func = OHOS::clReleaseKernel;
446 MS_ASSERT(func != nullptr);
447 return func(kernel);
448 }
449
450 // clSetKernelArg wrapper, use OpenCLWrapper function.
clSetKernelArg(cl_kernel kernel,cl_uint arg_index,size_t arg_size,const void * arg_value)451 cl_int clSetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value)
452 {
453 OHOS::InitOpenCL();
454 auto func = OHOS::clSetKernelArg;
455 MS_ASSERT(func != nullptr);
456 return func(kernel, arg_index, arg_size, arg_value);
457 }
458
459 // clCreateBuffer wrapper, use OpenCLWrapper function.
clCreateBuffer(cl_context context,cl_mem_flags flags,size_t size,void * host_ptr,cl_int * errcode_ret)460 cl_mem clCreateBuffer(cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret)
461 {
462 OHOS::InitOpenCL();
463 auto func = OHOS::clCreateBuffer;
464 MS_ASSERT(func != nullptr);
465 return func(context, flags, size, host_ptr, errcode_ret);
466 }
467
468 // clRetainMemObject wrapper, use OpenCLWrapper function.
clRetainMemObject(cl_mem memobj)469 cl_int clRetainMemObject(cl_mem memobj)
470 {
471 OHOS::InitOpenCL();
472 auto func = OHOS::clRetainMemObject;
473 MS_ASSERT(func != nullptr);
474 return func(memobj);
475 }
476
477 // clReleaseMemObject wrapper, use OpenCLWrapper function.
clReleaseMemObject(cl_mem memobj)478 cl_int clReleaseMemObject(cl_mem memobj)
479 {
480 OHOS::InitOpenCL();
481 auto func = OHOS::clReleaseMemObject;
482 MS_ASSERT(func != nullptr);
483 return func(memobj);
484 }
485
486 // clGetImageInfo wrapper, use OpenCLWrapper function.
clGetImageInfo(cl_mem image,cl_image_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)487 cl_int clGetImageInfo(cl_mem image, cl_image_info param_name, size_t param_value_size, void *param_value,
488 size_t *param_value_size_ret)
489 {
490 OHOS::InitOpenCL();
491 auto func = OHOS::clGetImageInfo;
492 MS_ASSERT(func != nullptr);
493 return func(image, param_name, param_value_size, param_value, param_value_size_ret);
494 }
495
496 // clRetainCommandQueue wrapper, use OpenCLWrapper function.
clRetainCommandQueue(cl_command_queue command_queue)497 cl_int clRetainCommandQueue(cl_command_queue command_queue)
498 {
499 OHOS::InitOpenCL();
500 auto func = OHOS::clRetainCommandQueue;
501 MS_ASSERT(func != nullptr);
502 return func(command_queue);
503 }
504
505 // clReleaseCommandQueue wrapper, use OpenCLWrapper function.
clReleaseCommandQueue(cl_command_queue command_queue)506 cl_int clReleaseCommandQueue(cl_command_queue command_queue)
507 {
508 OHOS::InitOpenCL();
509 auto func = OHOS::clReleaseCommandQueue;
510 MS_ASSERT(func != nullptr);
511 return func(command_queue);
512 }
513
514 // clEnqueueReadBuffer wrapper, use OpenCLWrapper function.
clEnqueueReadBuffer(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_read,size_t offset,size_t size,void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)515 cl_int clEnqueueReadBuffer(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset,
516 size_t size, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list,
517 cl_event *event)
518 {
519 OHOS::InitOpenCL();
520 auto func = OHOS::clEnqueueReadBuffer;
521 MS_ASSERT(func != nullptr);
522 return func(command_queue, buffer, blocking_read, offset, size, ptr, num_events_in_wait_list,
523 event_wait_list, event);
524 }
525
526 // clEnqueueReadBufferRect wrapper, use OpenCLWrapper function.
clEnqueueReadBufferRect(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_read,const size_t * buffer_origin,const size_t * host_origin,const size_t * region,size_t buffer_row_pitch,size_t buffer_slice_pitch,size_t host_row_pitch,size_t host_slice_pitch,void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)527 cl_int clEnqueueReadBufferRect(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read,
528 const size_t *buffer_origin, const size_t *host_origin, const size_t *region,
529 size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch,
530 size_t host_slice_pitch, void *ptr, cl_uint num_events_in_wait_list,
531 const cl_event *event_wait_list, cl_event *event)
532 {
533 OHOS::InitOpenCL();
534 auto func = OHOS::clEnqueueReadBufferRect;
535 MS_ASSERT(func != nullptr);
536 return func(command_queue, buffer, blocking_read, buffer_origin, host_origin, region, buffer_row_pitch,
537 buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, num_events_in_wait_list,
538 event_wait_list, event);
539 }
540
541 // clEnqueueWriteBuffer wrapper, use OpenCLWrapper function.
clEnqueueWriteBuffer(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_write,size_t offset,size_t size,const void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)542 cl_int clEnqueueWriteBuffer(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset,
543 size_t size, const void *ptr, cl_uint num_events_in_wait_list,
544 const cl_event *event_wait_list, cl_event *event)
545 {
546 OHOS::InitOpenCL();
547 auto func = OHOS::clEnqueueWriteBuffer;
548 MS_ASSERT(func != nullptr);
549 return func(command_queue, buffer, blocking_write, offset, size, ptr, num_events_in_wait_list, event_wait_list,
550 event);
551 }
552
553 // clEnqueueWriteImage wrapper, use OpenCLWrapper function.
clEnqueueWriteImage(cl_command_queue command_queue,cl_mem image,cl_bool blocking_write,const size_t * origin,const size_t * region,size_t input_row_pitch,size_t input_slice_pitch,const void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)554 cl_int clEnqueueWriteImage(cl_command_queue command_queue, cl_mem image, cl_bool blocking_write, const size_t *origin,
555 const size_t *region, size_t input_row_pitch, size_t input_slice_pitch, const void *ptr,
556 cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
557 {
558 OHOS::InitOpenCL();
559 auto func = OHOS::clEnqueueWriteImage;
560 MS_ASSERT(func != nullptr);
561 return func(command_queue, image, blocking_write, origin, region, input_row_pitch, input_slice_pitch, ptr,
562 num_events_in_wait_list, event_wait_list, event);
563 }
564
565 // clEnqueueReadImage wrapper, use OpenCLWrapper function.
clEnqueueReadImage(cl_command_queue command_queue,cl_mem image,cl_bool blocking_read,const size_t * origin,const size_t * region,size_t row_pitch,size_t slice_pitch,void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)566 cl_int clEnqueueReadImage(cl_command_queue command_queue, cl_mem image, cl_bool blocking_read, const size_t *origin,
567 const size_t *region, size_t row_pitch, size_t slice_pitch, void *ptr,
568 cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
569 {
570 OHOS::InitOpenCL();
571 auto func = OHOS::clEnqueueReadImage;
572 MS_ASSERT(func != nullptr);
573 return func(command_queue, image, blocking_read, origin, region, row_pitch, slice_pitch, ptr,
574 num_events_in_wait_list, event_wait_list, event);
575 }
576
577 // clEnqueueMapBuffer wrapper, use OpenCLWrapper function.
clEnqueueMapBuffer(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_map,cl_map_flags map_flags,size_t offset,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event,cl_int * errcode_ret)578 void *clEnqueueMapBuffer(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map, cl_map_flags map_flags,
579 size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list,
580 cl_event *event, cl_int *errcode_ret)
581 {
582 OHOS::InitOpenCL();
583 auto func = OHOS::clEnqueueMapBuffer;
584 MS_ASSERT(func != nullptr);
585 return func(command_queue, buffer, blocking_map, map_flags, offset, size, num_events_in_wait_list, event_wait_list,
586 event, errcode_ret);
587 }
588
589 // clEnqueueMapImage wrapper, use OpenCLWrapper function.
clEnqueueMapImage(cl_command_queue command_queue,cl_mem image,cl_bool blocking_map,cl_map_flags map_flags,const size_t * origin,const size_t * region,size_t * image_row_pitch,size_t * image_slice_pitch,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event,cl_int * errcode_ret)590 void *clEnqueueMapImage(cl_command_queue command_queue, cl_mem image, cl_bool blocking_map, cl_map_flags map_flags,
591 const size_t *origin, const size_t *region, size_t *image_row_pitch, size_t *image_slice_pitch,
592 cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event,
593 cl_int *errcode_ret)
594 {
595 OHOS::InitOpenCL();
596 auto func = OHOS::clEnqueueMapImage;
597 MS_ASSERT(func != nullptr);
598 return func(command_queue, image, blocking_map, map_flags, origin, region, image_row_pitch, image_slice_pitch,
599 num_events_in_wait_list, event_wait_list, event, errcode_ret);
600 }
601
602 // clEnqueueUnmapMemObject wrapper, use OpenCLWrapper function.
clEnqueueUnmapMemObject(cl_command_queue command_queue,cl_mem memobj,void * mapped_ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)603 cl_int clEnqueueUnmapMemObject(cl_command_queue command_queue, cl_mem memobj, void *mapped_ptr,
604 cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
605 {
606 OHOS::InitOpenCL();
607 auto func = OHOS::clEnqueueUnmapMemObject;
608 MS_ASSERT(func != nullptr);
609 return func(command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
610 }
611
612 // clGetKernelWorkGroupInfo wrapper, use OpenCLWrapper function.
clGetKernelWorkGroupInfo(cl_kernel kernel,cl_device_id device,cl_kernel_work_group_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)613 cl_int clGetKernelWorkGroupInfo(cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name,
614 size_t param_value_size, void *param_value, size_t *param_value_size_ret)
615 {
616 OHOS::InitOpenCL();
617 auto func = OHOS::clGetKernelWorkGroupInfo;
618 MS_ASSERT(func != nullptr);
619 return func(kernel, device, param_name, param_value_size, param_value, param_value_size_ret);
620 }
621
622 // clGetEventProfilingInfo wrapper, use OpenCLWrapper function.
clGetEventProfilingInfo(cl_event event,cl_profiling_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)623 cl_int clGetEventProfilingInfo(cl_event event, cl_profiling_info param_name, size_t param_value_size, void *param_value,
624 size_t *param_value_size_ret)
625 {
626 OHOS::InitOpenCL();
627 auto func = OHOS::clGetEventProfilingInfo;
628 MS_ASSERT(func != nullptr);
629 return func(event, param_name, param_value_size, param_value, param_value_size_ret);
630 }
631
632 // clEnqueueNDRangeKernel wrapper, use OpenCLWrapper function.
clEnqueueNDRangeKernel(cl_command_queue command_queue,cl_kernel kernel,cl_uint work_dim,const size_t * global_work_offset,const size_t * global_work_size,const size_t * local_work_size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)633 cl_int clEnqueueNDRangeKernel(cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim,
634 const size_t *global_work_offset, const size_t *global_work_size,
635 const size_t *local_work_size, cl_uint num_events_in_wait_list,
636 const cl_event *event_wait_list, cl_event *event)
637 {
638 OHOS::InitOpenCL();
639 auto func = OHOS::clEnqueueNDRangeKernel;
640 MS_ASSERT(func != nullptr);
641 return func(command_queue, kernel, work_dim, global_work_offset, global_work_size, local_work_size,
642 num_events_in_wait_list, event_wait_list, event);
643 }
644
645 // clWaitForEvents wrapper, use OpenCLWrapper function.
clWaitForEvents(cl_uint num_events,const cl_event * event_list)646 cl_int clWaitForEvents(cl_uint num_events, const cl_event *event_list)
647 {
648 OHOS::InitOpenCL();
649 auto func = OHOS::clWaitForEvents;
650 MS_ASSERT(func != nullptr);
651 return func(num_events, event_list);
652 }
653
654 // clRetainEvent wrapper, use OpenCLWrapper function.
clRetainEvent(cl_event event)655 cl_int clRetainEvent(cl_event event)
656 {
657 OHOS::InitOpenCL();
658 auto func = OHOS::clRetainEvent;
659 MS_ASSERT(func != nullptr);
660 return func(event);
661 }
662
663 // clReleaseEvent wrapper, use OpenCLWrapper function.
clReleaseEvent(cl_event event)664 cl_int clReleaseEvent(cl_event event)
665 {
666 OHOS::InitOpenCL();
667 auto func = OHOS::clReleaseEvent;
668 MS_ASSERT(func != nullptr);
669 return func(event);
670 }
671
672 // clGetEventInfo wrapper, use OpenCLWrapper function.
clGetEventInfo(cl_event event,cl_event_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)673 cl_int clGetEventInfo(cl_event event, cl_event_info param_name, size_t param_value_size, void *param_value,
674 size_t *param_value_size_ret)
675 {
676 OHOS::InitOpenCL();
677 auto func = OHOS::clGetEventInfo;
678 MS_ASSERT(func != nullptr);
679 return func(event, param_name, param_value_size, param_value, param_value_size_ret);
680 }
681
682 // clFlush wrapper, use OpenCLWrapper function.
clFlush(cl_command_queue command_queue)683 cl_int clFlush(cl_command_queue command_queue)
684 {
685 OHOS::InitOpenCL();
686 auto func = OHOS::clFlush;
687 MS_ASSERT(func != nullptr);
688 return func(command_queue);
689 }
690
691 // clFinish wrapper, use OpenCLWrapper function.
clFinish(cl_command_queue command_queue)692 cl_int clFinish(cl_command_queue command_queue)
693 {
694 OHOS::InitOpenCL();
695 auto func = OHOS::clFinish;
696 MS_ASSERT(func != nullptr);
697 return func(command_queue);
698 }
699
700 // clCreateImage2D wrapper, use OpenCLWrapper function.
clCreateImage2D(cl_context context,cl_mem_flags flags,const cl_image_format * image_format,size_t imageWidth,size_t imageHeight,size_t image_row_pitch,void * host_ptr,cl_int * errcode_ret)701 cl_mem clCreateImage2D(cl_context context, cl_mem_flags flags, const cl_image_format *image_format, size_t imageWidth,
702 size_t imageHeight, size_t image_row_pitch, void *host_ptr, cl_int *errcode_ret)
703 {
704 OHOS::InitOpenCL();
705 auto func = OHOS::clCreateImage2D;
706 MS_ASSERT(func != nullptr);
707 return func(context, flags, image_format, imageWidth, imageHeight, image_row_pitch, host_ptr, errcode_ret);
708 }
709
710 // clCreateImage3D wrapper, use OpenCLWrapper function.
clCreateImage3D(cl_context context,cl_mem_flags flags,const cl_image_format * image_format,size_t imageWidth,size_t imageHeight,size_t imageDepth,size_t image_row_pitch,size_t image_slice_pitch,void * host_ptr,cl_int * errcode_ret)711 cl_mem clCreateImage3D(cl_context context, cl_mem_flags flags, const cl_image_format *image_format, size_t imageWidth,
712 size_t imageHeight, size_t imageDepth, size_t image_row_pitch, size_t image_slice_pitch,
713 void *host_ptr, cl_int *errcode_ret)
714 {
715 OHOS::InitOpenCL();
716 auto func = OHOS::clCreateImage3D;
717 MS_ASSERT(func != nullptr);
718 return func(context, flags, image_format, imageWidth, imageHeight, imageDepth, image_row_pitch, image_slice_pitch,
719 host_ptr, errcode_ret);
720 }
721
722 // clCreateCommandQueue wrapper, use OpenCLWrapper function.
clCreateCommandQueue(cl_context context,cl_device_id device,cl_command_queue_properties properties,cl_int * errcode_ret)723 cl_command_queue clCreateCommandQueue(cl_context context, cl_device_id device, cl_command_queue_properties properties,
724 cl_int *errcode_ret)
725 {
726 OHOS::InitOpenCL();
727 auto func = OHOS::clCreateCommandQueue;
728 MS_ASSERT(func != nullptr);
729 return func(context, device, properties, errcode_ret);
730 }
731
732 // clGetCommandQueueInfo wrapper, use OpenCLWrapper function.
clGetCommandQueueInfo(cl_command_queue command_queue,cl_command_queue_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)733 cl_int clGetCommandQueueInfo(cl_command_queue command_queue, cl_command_queue_info param_name, size_t param_value_size,
734 void *param_value, size_t *param_value_size_ret)
735 {
736 OHOS::InitOpenCL();
737 auto func = OHOS::clGetCommandQueueInfo;
738 MS_ASSERT(func != nullptr);
739 return func(command_queue, param_name, param_value_size, param_value, param_value_size_ret);
740 }
741
742 // clEnqueueCopyImage wrapper, use OpenCLWrapper function.
clEnqueueCopyImage(cl_command_queue queue,cl_mem src_image,cl_mem dst_image,const size_t * src_origin,const size_t * dst_origin,const size_t * region,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)743 cl_int clEnqueueCopyImage(cl_command_queue queue, cl_mem src_image, cl_mem dst_image, const size_t *src_origin,
744 const size_t *dst_origin, const size_t *region, cl_uint num_events_in_wait_list,
745 const cl_event *event_wait_list, cl_event *event)
746 {
747 OHOS::InitOpenCL();
748 auto func = OHOS::clEnqueueCopyImage;
749 MS_ASSERT(func != nullptr);
750 return func(queue, src_image, dst_image, src_origin, dst_origin, region, num_events_in_wait_list, event_wait_list,
751 event);
752 }
753
754 // clEnqueueCopyBufferToImage wrapper, use OpenCLWrapper function.
clEnqueueCopyBufferToImage(cl_command_queue command_queue,cl_mem src_buffer,cl_mem dst_image,size_t src_offset,const size_t * dst_origin,const size_t * region,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)755 cl_int clEnqueueCopyBufferToImage(cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_image,
756 size_t src_offset, const size_t *dst_origin, const size_t *region,
757 cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
758 {
759 OHOS::InitOpenCL();
760 auto func = OHOS::clEnqueueCopyBufferToImage;
761 MS_ASSERT(func != nullptr);
762 return func(command_queue, src_buffer, dst_image, src_offset, dst_origin, region, num_events_in_wait_list,
763 event_wait_list, event);
764 }
765
766 // clEnqueueCopyImageToBuffer wrapper, use OpenCLWrapper function.
clEnqueueCopyImageToBuffer(cl_command_queue command_queue,cl_mem src_image,cl_mem dst_buffer,const size_t * src_origin,const size_t * region,size_t dst_offset,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)767 cl_int clEnqueueCopyImageToBuffer(cl_command_queue command_queue, cl_mem src_image, cl_mem dst_buffer,
768 const size_t *src_origin, const size_t *region, size_t dst_offset,
769 cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
770 {
771 OHOS::InitOpenCL();
772 auto func = OHOS::clEnqueueCopyImageToBuffer;
773 MS_ASSERT(func != nullptr);
774 return func(command_queue, src_image, dst_buffer, src_origin, region, dst_offset, num_events_in_wait_list,
775 event_wait_list, event);
776 }
777
778 #if defined(CL_TARGET_OPENCL_VERSION) && CL_TARGET_OPENCL_VERSION >= 120
779
780 // clRetainDevice wrapper, use OpenCLWrapper function.
clRetainDevice(cl_device_id device)781 cl_int clRetainDevice(cl_device_id device)
782 {
783 OHOS::InitOpenCL();
784 auto func = OHOS::clRetainDevice;
785 MS_ASSERT(func != nullptr);
786 return func(device);
787 }
788
789 // clReleaseDevice wrapper, use OpenCLWrapper function.
clReleaseDevice(cl_device_id device)790 cl_int clReleaseDevice(cl_device_id device)
791 {
792 OHOS::InitOpenCL();
793 auto func = OHOS::clReleaseDevice;
794 MS_ASSERT(func != nullptr);
795 return func(device);
796 }
797
798 // clCreateImage wrapper, use OpenCLWrapper function.
clCreateImage(cl_context context,cl_mem_flags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,void * host_ptr,cl_int * errcode_ret)799 cl_mem clCreateImage(cl_context context, cl_mem_flags flags, const cl_image_format *image_format,
800 const cl_image_desc *image_desc, void *host_ptr, cl_int *errcode_ret)
801 {
802 OHOS::InitOpenCL();
803 auto func = OHOS::clCreateImage;
804 MS_ASSERT(func != nullptr);
805 return func(context, flags, image_format, image_desc, host_ptr, errcode_ret);
806 }
807
clEnqueueFillImage(cl_command_queue command_queue,cl_mem image,const void * fill_color,const size_t * origin,const size_t * region,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)808 cl_int clEnqueueFillImage(cl_command_queue command_queue, cl_mem image, const void *fill_color, const size_t *origin,
809 const size_t *region, cl_uint num_events_in_wait_list, const cl_event *event_wait_list,
810 cl_event *event)
811 {
812 OHOS::InitOpenCL();
813 auto func = OHOS::clEnqueueFillImage;
814 MS_ASSERT(func != nullptr);
815 return func(command_queue, image, fill_color, origin, region, num_events_in_wait_list, event_wait_list, event);
816 }
817
818 #endif
819
820 #if defined(CL_TARGET_OPENCL_VERSION) && CL_TARGET_OPENCL_VERSION >= 200
821
822 // clCreateCommandQueueWithProperties wrapper, use OpenCLWrapper function.
clCreateCommandQueueWithProperties(cl_context context,cl_device_id device,const cl_queue_properties * properties,cl_int * errcode_ret)823 cl_command_queue clCreateCommandQueueWithProperties(cl_context context, cl_device_id device,
824 const cl_queue_properties *properties, cl_int *errcode_ret)
825 {
826 OHOS::InitOpenCL();
827 auto func = OHOS::clCreateCommandQueueWithProperties;
828 MS_ASSERT(func != nullptr);
829 return func(context, device, properties, errcode_ret);
830 }
831
832 // clGetExtensionFunctionAddress wrapper, use OpenCLWrapper function.
clGetExtensionFunctionAddress(const char * func_name)833 void *clGetExtensionFunctionAddress(const char *func_name)
834 {
835 OHOS::InitOpenCL();
836 auto func = OHOS::clGetExtensionFunctionAddress;
837 MS_ASSERT(func != nullptr);
838 return func(func_name);
839 }
840 // clCreateProgramWithIL wrapper, use OpenCLWrapper function.
clCreateProgramWithIL(cl_context context,const void * il,size_t length,cl_int * ret)841 cl_program clCreateProgramWithIL(cl_context context, const void *il, size_t length, cl_int *ret)
842 {
843 OHOS::InitOpenCL();
844 auto func = OHOS::clCreateProgramWithIL;
845 MS_ASSERT(func != nullptr);
846 return func(context, il, length, ret);
847 }
848
849 // clSVMAlloc wrapper, use OpenCLWrapper function.
clSVMAlloc(cl_context context,cl_mem_flags flags,size_t size,cl_uint align)850 void *clSVMAlloc(cl_context context, cl_mem_flags flags, size_t size, cl_uint align)
851 {
852 OHOS::InitOpenCL();
853 auto func = OHOS::clSVMAlloc;
854 MS_ASSERT(func != nullptr);
855 return func(context, flags, size, align);
856 }
857
858 // clSVMFree wrapper, use OpenCLWrapper function.
clSVMFree(cl_context context,void * buffer)859 void clSVMFree(cl_context context, void *buffer)
860 {
861 OHOS::InitOpenCL();
862 auto func = OHOS::clSVMFree;
863 MS_ASSERT(func != nullptr);
864 func(context, buffer);
865 }
866
867 // clEnqueueSVMMap wrapper, use OpenCLWrapper function.
clEnqueueSVMMap(cl_command_queue command_queue,cl_bool blocking,cl_map_flags flags,void * host_ptr,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)868 cl_int clEnqueueSVMMap(cl_command_queue command_queue, cl_bool blocking, cl_map_flags flags, void *host_ptr,
869 size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
870 {
871 OHOS::InitOpenCL();
872 auto func = OHOS::clEnqueueSVMMap;
873 MS_ASSERT(func != nullptr);
874 return func(command_queue, blocking, flags, host_ptr, size, num_events_in_wait_list, event_wait_list, event);
875 }
876
877 // clEnqueueSVMUnmap wrapper, use OpenCLWrapper function.
clEnqueueSVMUnmap(cl_command_queue command_queue,void * host_ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event)878 cl_int clEnqueueSVMUnmap(cl_command_queue command_queue, void *host_ptr, cl_uint num_events_in_wait_list,
879 const cl_event *event_wait_list, cl_event *event)
880 {
881 OHOS::InitOpenCL();
882 auto func = OHOS::clEnqueueSVMUnmap;
883 MS_ASSERT(func != nullptr);
884 return func(command_queue, host_ptr, num_events_in_wait_list, event_wait_list, event);
885 }
886
887 // clSetKernelArgSVMPointer wrapper, use OpenCLWrapper function.
clSetKernelArgSVMPointer(cl_kernel kernel,cl_uint index,const void * host_ptr)888 cl_int clSetKernelArgSVMPointer(cl_kernel kernel, cl_uint index, const void *host_ptr)
889 {
890 OHOS::InitOpenCL();
891 auto func = OHOS::clSetKernelArgSVMPointer;
892 MS_ASSERT(func != nullptr);
893 return func(kernel, index, host_ptr);
894 }
895 #endif
896
897 #endif // USE_OPENCL_WRAPPER
898