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