xref: /aosp_15_r20/external/tensorflow/tensorflow/lite/delegates/gpu/cl/opencl_wrapper.h (revision b6fb3261f9314811a0f4371741dbb8839866f948)
1 /* Copyright 2019 The TensorFlow Authors. All Rights Reserved.
2 
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 
16 #ifndef TENSORFLOW_LITE_DELEGATES_GPU_CL_OPENCL_WRAPPER_H_
17 #define TENSORFLOW_LITE_DELEGATES_GPU_CL_OPENCL_WRAPPER_H_
18 
19 #include <CL/cl.h>
20 #include <CL/cl_egl.h>
21 #include <CL/cl_ext.h>
22 #include <CL/cl_gl.h>
23 #include <CL/cl_platform.h>
24 #include "tensorflow/lite/delegates/gpu/cl/default/qcom_wrapper.h"
25 #include "tensorflow/lite/delegates/gpu/common/status.h"
26 
27 namespace tflite {
28 namespace gpu {
29 namespace cl {
30 
31 absl::Status LoadOpenCL();
32 
33 typedef cl_int(CL_API_CALL *PFN_clGetPlatformIDs)(
34     cl_uint /* num_entries */, cl_platform_id * /* platforms */,
35     cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0;
36 typedef cl_int(CL_API_CALL *PFN_clGetPlatformInfo)(
37     cl_platform_id /* platform */, cl_platform_info /* param_name */,
38     size_t /* param_value_size */, void * /* param_value */,
39     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
40 typedef cl_int(CL_API_CALL *PFN_clGetDeviceIDs)(
41     cl_platform_id /* platform */, cl_device_type /* device_type */,
42     cl_uint /* num_entries */, cl_device_id * /* devices */,
43     cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0;
44 typedef cl_int(CL_API_CALL *PFN_clGetDeviceInfo)(
45     cl_device_id /* device */, cl_device_info /* param_name */,
46     size_t /* param_value_size */, void * /* param_value */,
47     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
48 typedef cl_int(CL_API_CALL *PFN_clCreateSubDevices)(
49     cl_device_id /* in_device */,
50     const cl_device_partition_property * /* properties */,
51     cl_uint /* num_devices */, cl_device_id * /* out_devices */,
52     cl_uint * /* num_devices_ret */) CL_API_SUFFIX__VERSION_1_2;
53 typedef cl_int(CL_API_CALL *PFN_clRetainDevice)(cl_device_id /* device */)
54     CL_API_SUFFIX__VERSION_1_2;
55 typedef cl_int(CL_API_CALL *PFN_clReleaseDevice)(cl_device_id /* device */)
56     CL_API_SUFFIX__VERSION_1_2;
57 typedef cl_context(CL_API_CALL *PFN_clCreateContext)(
58     const cl_context_properties * /* properties */, cl_uint /* num_devices */,
59     const cl_device_id * /* devices */,
60     void(CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t,
61                                          void *),
62     void * /* user_data */,
63     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
64 typedef cl_context(CL_API_CALL *PFN_clCreateContextFromType)(
65     const cl_context_properties * /* properties */,
66     cl_device_type /* device_type */,
67     void(CL_CALLBACK * /* pfn_notify*/)(const char *, const void *, size_t,
68                                         void *),
69     void * /* user_data */,
70     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
71 typedef cl_int(CL_API_CALL *PFN_clRetainContext)(cl_context /* context */)
72     CL_API_SUFFIX__VERSION_1_0;
73 typedef cl_int(CL_API_CALL *PFN_clReleaseContext)(cl_context /* context */)
74     CL_API_SUFFIX__VERSION_1_0;
75 typedef cl_int(CL_API_CALL *PFN_clGetContextInfo)(
76     cl_context /* context */, cl_context_info /* param_name */,
77     size_t /* param_value_size */, void * /* param_value */,
78     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
79 typedef cl_command_queue(CL_API_CALL *PFN_clCreateCommandQueueWithProperties)(
80     cl_context /* context */, cl_device_id /* device */,
81     const cl_queue_properties * /* properties */,
82     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0;
83 typedef cl_int(CL_API_CALL *PFN_clRetainCommandQueue)(
84     cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
85 typedef cl_int(CL_API_CALL *PFN_clReleaseCommandQueue)(
86     cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
87 typedef cl_int(CL_API_CALL *PFN_clGetCommandQueueInfo)(
88     cl_command_queue /* command_queue */,
89     cl_command_queue_info /* param_name */, size_t /* param_value_size */,
90     void * /* param_value */,
91     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
92 typedef cl_mem(CL_API_CALL *PFN_clCreateBuffer)(
93     cl_context /* context */, cl_mem_flags /* flags */, size_t /* size */,
94     void * /* host_ptr */,
95     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
96 typedef cl_mem(CL_API_CALL *PFN_clCreateSubBuffer)(
97     cl_mem /* buffer */, cl_mem_flags /* flags */,
98     cl_buffer_create_type /* buffer_create_type */,
99     const void * /* buffer_create_info */,
100     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
101 typedef cl_mem(CL_API_CALL *PFN_clCreateImage)(
102     cl_context /* context */, cl_mem_flags /* flags */,
103     const cl_image_format * /* image_format */,
104     const cl_image_desc * /* image_desc */, void * /* host_ptr */,
105     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
106 typedef cl_mem(CL_API_CALL *PFN_clCreatePipe)(
107     cl_context /* context */, cl_mem_flags /* flags */,
108     cl_uint /* pipe_packet_size */, cl_uint /* pipe_max_packets */,
109     const cl_pipe_properties * /* properties */,
110     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0;
111 typedef cl_int(CL_API_CALL *PFN_clRetainMemObject)(cl_mem /* memobj */)
112     CL_API_SUFFIX__VERSION_1_0;
113 typedef cl_int(CL_API_CALL *PFN_clReleaseMemObject)(cl_mem /* memobj */)
114     CL_API_SUFFIX__VERSION_1_0;
115 typedef cl_int(CL_API_CALL *PFN_clGetSupportedImageFormats)(
116     cl_context /* context */, cl_mem_flags /* flags */,
117     cl_mem_object_type /* image_type */, cl_uint /* num_entries */,
118     cl_image_format * /* image_formats */,
119     cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0;
120 typedef cl_int(CL_API_CALL *PFN_clGetMemObjectInfo)(
121     cl_mem /* memobj */, cl_mem_info /* param_name */,
122     size_t /* param_value_size */, void * /* param_value */,
123     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
124 typedef cl_int(CL_API_CALL *PFN_clGetImageInfo)(
125     cl_mem /* image */, cl_image_info /* param_name */,
126     size_t /* param_value_size */, void * /* param_value */,
127     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
128 typedef cl_int(CL_API_CALL *PFN_clGetPipeInfo)(
129     cl_mem /* pipe */, cl_pipe_info /* param_name */,
130     size_t /* param_value_size */, void * /* param_value */,
131     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_2_0;
132 typedef cl_int(CL_API_CALL *PFN_clSetMemObjectDestructorCallback)(
133     cl_mem /* memobj */,
134     void(CL_CALLBACK * /*pfn_notify*/)(cl_mem /* memobj */,
135                                        void * /*user_data*/),
136     void * /*user_data */) CL_API_SUFFIX__VERSION_1_1;
137 typedef void *(CL_API_CALL *PFN_clSVMAlloc)(
138     cl_context /* context */, cl_svm_mem_flags /* flags */, size_t /* size */,
139     cl_uint /* alignment */)CL_API_SUFFIX__VERSION_2_0;
140 typedef void(CL_API_CALL *PFN_clSVMFree)(cl_context /* context */,
141                                          void * /* svm_pointer */)
142     CL_API_SUFFIX__VERSION_2_0;
143 typedef cl_sampler(CL_API_CALL *PFN_clCreateSamplerWithProperties)(
144     cl_context /* context */,
145     const cl_sampler_properties * /* normalized_coords */,
146     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0;
147 typedef cl_int(CL_API_CALL *PFN_clRetainSampler)(cl_sampler /* sampler */)
148     CL_API_SUFFIX__VERSION_1_0;
149 typedef cl_int(CL_API_CALL *PFN_clReleaseSampler)(cl_sampler /* sampler */)
150     CL_API_SUFFIX__VERSION_1_0;
151 typedef cl_int(CL_API_CALL *PFN_clGetSamplerInfo)(
152     cl_sampler /* sampler */, cl_sampler_info /* param_name */,
153     size_t /* param_value_size */, void * /* param_value */,
154     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
155 typedef cl_program(CL_API_CALL *PFN_clCreateProgramWithSource)(
156     cl_context /* context */, cl_uint /* count */, const char ** /* strings */,
157     const size_t * /* lengths */,
158     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
159 typedef cl_program(CL_API_CALL *PFN_clCreateProgramWithBinary)(
160     cl_context /* context */, cl_uint /* num_devices */,
161     const cl_device_id * /* device_list */, const size_t * /* lengths */,
162     const unsigned char ** /* binaries */, cl_int * /* binary_status */,
163     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
164 typedef cl_program(CL_API_CALL *PFN_clCreateProgramWithBuiltInKernels)(
165     cl_context /* context */, cl_uint /* num_devices */,
166     const cl_device_id * /* device_list */, const char * /* kernel_names */,
167     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
168 typedef cl_int(CL_API_CALL *PFN_clRetainProgram)(cl_program /* program */)
169     CL_API_SUFFIX__VERSION_1_0;
170 typedef cl_int(CL_API_CALL *PFN_clReleaseProgram)(cl_program /* program */)
171     CL_API_SUFFIX__VERSION_1_0;
172 typedef cl_int(CL_API_CALL *PFN_clBuildProgram)(
173     cl_program /* program */, cl_uint /* num_devices */,
174     const cl_device_id * /* device_list */, const char * /* options */,
175     void(CL_CALLBACK * /* pfn_notify */)(cl_program /* program */,
176                                          void * /* user_data */),
177     void * /* user_data */) CL_API_SUFFIX__VERSION_1_0;
178 typedef cl_int(CL_API_CALL *PFN_clCompileProgram)(
179     cl_program /* program */, cl_uint /* num_devices */,
180     const cl_device_id * /* device_list */, const char * /* options */,
181     cl_uint /* num_input_headers */, const cl_program * /* input_headers */,
182     const char ** /* header_include_names */,
183     void(CL_CALLBACK * /* pfn_notify */)(cl_program /* program */,
184                                          void * /* user_data */),
185     void * /* user_data */) CL_API_SUFFIX__VERSION_1_2;
186 typedef cl_program(CL_API_CALL *PFN_clLinkProgram)(
187     cl_context /* context */, cl_uint /* num_devices */,
188     const cl_device_id * /* device_list */, const char * /* options */,
189     cl_uint /* num_input_programs */, const cl_program * /* input_programs */,
190     void(CL_CALLBACK * /* pfn_notify */)(cl_program /* program */,
191                                          void * /* user_data */),
192     void * /* user_data */,
193     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
194 typedef cl_int(CL_API_CALL *PFN_clUnloadPlatformCompiler)(
195     cl_platform_id /* platform */) CL_API_SUFFIX__VERSION_1_2;
196 typedef cl_int(CL_API_CALL *PFN_clGetProgramInfo)(
197     cl_program /* program */, cl_program_info /* param_name */,
198     size_t /* param_value_size */, void * /* param_value */,
199     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
200 typedef cl_int(CL_API_CALL *PFN_clGetProgramBuildInfo)(
201     cl_program /* program */, cl_device_id /* device */,
202     cl_program_build_info /* param_name */, size_t /* param_value_size */,
203     void * /* param_value */,
204     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
205 typedef cl_kernel(CL_API_CALL *PFN_clCreateKernel)(
206     cl_program /* program */, const char * /* kernel_name */,
207     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
208 typedef cl_int(CL_API_CALL *PFN_clCreateKernelsInProgram)(
209     cl_program /* program */, cl_uint /* num_kernels */,
210     cl_kernel * /* kernels */,
211     cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0;
212 typedef cl_int(CL_API_CALL *PFN_clRetainKernel)(cl_kernel /* kernel */)
213     CL_API_SUFFIX__VERSION_1_0;
214 typedef cl_int(CL_API_CALL *PFN_clReleaseKernel)(cl_kernel /* kernel */)
215     CL_API_SUFFIX__VERSION_1_0;
216 typedef cl_int(CL_API_CALL *PFN_clSetKernelArg)(
217     cl_kernel /* kernel */, cl_uint /* arg_index */, size_t /* arg_size */,
218     const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0;
219 typedef cl_int(CL_API_CALL *PFN_clSetKernelArgSVMPointer)(
220     cl_kernel /* kernel */, cl_uint /* arg_index */,
221     const void * /* arg_value */) CL_API_SUFFIX__VERSION_2_0;
222 typedef cl_int(CL_API_CALL *PFN_clSetKernelExecInfo)(
223     cl_kernel /* kernel */, cl_kernel_exec_info /* param_name */,
224     size_t /* param_value_size */,
225     const void * /* param_value */) CL_API_SUFFIX__VERSION_2_0;
226 typedef cl_int(CL_API_CALL *PFN_clGetKernelInfo)(
227     cl_kernel /* kernel */, cl_kernel_info /* param_name */,
228     size_t /* param_value_size */, void * /* param_value */,
229     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
230 typedef cl_int(CL_API_CALL *PFN_clGetKernelArgInfo)(
231     cl_kernel /* kernel */, cl_uint /* arg_indx */,
232     cl_kernel_arg_info /* param_name */, size_t /* param_value_size */,
233     void * /* param_value */,
234     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_2;
235 typedef cl_int(CL_API_CALL *PFN_clGetKernelWorkGroupInfo)(
236     cl_kernel /* kernel */, cl_device_id /* device */,
237     cl_kernel_work_group_info /* param_name */, size_t /* param_value_size */,
238     void * /* param_value */,
239     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
240 typedef cl_int(CL_API_CALL *PFN_clWaitForEvents)(
241     cl_uint /* num_events */,
242     const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0;
243 typedef cl_int(CL_API_CALL *PFN_clGetEventInfo)(
244     cl_event /* event */, cl_event_info /* param_name */,
245     size_t /* param_value_size */, void * /* param_value */,
246     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
247 typedef cl_event(CL_API_CALL *PFN_clCreateUserEvent)(cl_context /* context */,
248                                                      cl_int * /* errcode_ret */)
249     CL_API_SUFFIX__VERSION_1_1;
250 typedef cl_int(CL_API_CALL *PFN_clRetainEvent)(cl_event /* event */)
251     CL_API_SUFFIX__VERSION_1_0;
252 typedef cl_int(CL_API_CALL *PFN_clReleaseEvent)(cl_event /* event */)
253     CL_API_SUFFIX__VERSION_1_0;
254 typedef cl_int(CL_API_CALL *PFN_clSetUserEventStatus)(
255     cl_event /* event */,
256     cl_int /* execution_status */) CL_API_SUFFIX__VERSION_1_1;
257 typedef cl_int(CL_API_CALL *PFN_clSetEventCallback)(
258     cl_event /* event */, cl_int /* command_exec_callback_type */,
259     void(CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *),
260     void * /* user_data */) CL_API_SUFFIX__VERSION_1_1;
261 typedef cl_int(CL_API_CALL *PFN_clGetEventProfilingInfo)(
262     cl_event /* event */, cl_profiling_info /* param_name */,
263     size_t /* param_value_size */, void * /* param_value */,
264     size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
265 typedef cl_int(CL_API_CALL *PFN_clFlush)(cl_command_queue /* command_queue */)
266     CL_API_SUFFIX__VERSION_1_0;
267 typedef cl_int(CL_API_CALL *PFN_clFinish)(cl_command_queue /* command_queue */)
268     CL_API_SUFFIX__VERSION_1_0;
269 typedef cl_int(CL_API_CALL *PFN_clEnqueueReadBuffer)(
270     cl_command_queue /* command_queue */, cl_mem /* buffer */,
271     cl_bool /* blocking_read */, size_t /* offset */, size_t /* size */,
272     void * /* ptr */, cl_uint /* num_events_in_wait_list */,
273     const cl_event * /* event_wait_list */,
274     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
275 typedef cl_int(CL_API_CALL *PFN_clEnqueueReadBufferRect)(
276     cl_command_queue /* command_queue */, cl_mem /* buffer */,
277     cl_bool /* blocking_read */, const size_t * /* buffer_offset */,
278     const size_t * /* host_offset */, const size_t * /* region */,
279     size_t /* buffer_row_pitch */, size_t /* buffer_slice_pitch */,
280     size_t /* host_row_pitch */, size_t /* host_slice_pitch */,
281     void * /* ptr */, cl_uint /* num_events_in_wait_list */,
282     const cl_event * /* event_wait_list */,
283     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
284 typedef cl_int(CL_API_CALL *PFN_clEnqueueWriteBuffer)(
285     cl_command_queue /* command_queue */, cl_mem /* buffer */,
286     cl_bool /* blocking_write */, size_t /* offset */, size_t /* size */,
287     const void * /* ptr */, cl_uint /* num_events_in_wait_list */,
288     const cl_event * /* event_wait_list */,
289     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
290 typedef cl_int(CL_API_CALL *PFN_clEnqueueWriteBufferRect)(
291     cl_command_queue /* command_queue */, cl_mem /* buffer */,
292     cl_bool /* blocking_write */, const size_t * /* buffer_offset */,
293     const size_t * /* host_offset */, const size_t * /* region */,
294     size_t /* buffer_row_pitch */, size_t /* buffer_slice_pitch */,
295     size_t /* host_row_pitch */, size_t /* host_slice_pitch */,
296     const void * /* ptr */, cl_uint /* num_events_in_wait_list */,
297     const cl_event * /* event_wait_list */,
298     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
299 typedef cl_int(CL_API_CALL *PFN_clEnqueueFillBuffer)(
300     cl_command_queue /* command_queue */, cl_mem /* buffer */,
301     const void * /* pattern */, size_t /* pattern_size */, size_t /* offset */,
302     size_t /* size */, cl_uint /* num_events_in_wait_list */,
303     const cl_event * /* event_wait_list */,
304     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
305 typedef cl_int(CL_API_CALL *PFN_clEnqueueCopyBuffer)(
306     cl_command_queue /* command_queue */, cl_mem /* src_buffer */,
307     cl_mem /* dst_buffer */, size_t /* src_offset */, size_t /* dst_offset */,
308     size_t /* size */, cl_uint /* num_events_in_wait_list */,
309     const cl_event * /* event_wait_list */,
310     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
311 typedef cl_int(CL_API_CALL *PFN_clEnqueueCopyBufferRect)(
312     cl_command_queue /* command_queue */, cl_mem /* src_buffer */,
313     cl_mem /* dst_buffer */, const size_t * /* src_origin */,
314     const size_t * /* dst_origin */, const size_t * /* region */,
315     size_t /* src_row_pitch */, size_t /* src_slice_pitch */,
316     size_t /* dst_row_pitch */, size_t /* dst_slice_pitch */,
317     cl_uint /* num_events_in_wait_list */,
318     const cl_event * /* event_wait_list */,
319     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
320 typedef cl_int(CL_API_CALL *PFN_clEnqueueReadImage)(
321     cl_command_queue /* command_queue */, cl_mem /* image */,
322     cl_bool /* blocking_read */, const size_t * /* origin[3] */,
323     const size_t * /* region[3] */, size_t /* row_pitch */,
324     size_t /* slice_pitch */, void * /* ptr */,
325     cl_uint /* num_events_in_wait_list */,
326     const cl_event * /* event_wait_list */,
327     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
328 typedef cl_int(CL_API_CALL *PFN_clEnqueueWriteImage)(
329     cl_command_queue /* command_queue */, cl_mem /* image */,
330     cl_bool /* blocking_write */, const size_t * /* origin[3] */,
331     const size_t * /* region[3] */, size_t /* input_row_pitch */,
332     size_t /* input_slice_pitch */, const void * /* ptr */,
333     cl_uint /* num_events_in_wait_list */,
334     const cl_event * /* event_wait_list */,
335     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
336 typedef cl_int(CL_API_CALL *PFN_clEnqueueFillImage)(
337     cl_command_queue /* command_queue */, cl_mem /* image */,
338     const void * /* fill_color */, const size_t * /* origin[3] */,
339     const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */,
340     const cl_event * /* event_wait_list */,
341     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
342 typedef cl_int(CL_API_CALL *PFN_clEnqueueCopyImage)(
343     cl_command_queue /* command_queue */, cl_mem /* src_image */,
344     cl_mem /* dst_image */, const size_t * /* src_origin[3] */,
345     const size_t * /* dst_origin[3] */, const size_t * /* region[3] */,
346     cl_uint /* num_events_in_wait_list */,
347     const cl_event * /* event_wait_list */,
348     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
349 typedef cl_int(CL_API_CALL *PFN_clEnqueueCopyImageToBuffer)(
350     cl_command_queue /* command_queue */, cl_mem /* src_image */,
351     cl_mem /* dst_buffer */, const size_t * /* src_origin[3] */,
352     const size_t * /* region[3] */, size_t /* dst_offset */,
353     cl_uint /* num_events_in_wait_list */,
354     const cl_event * /* event_wait_list */,
355     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
356 typedef cl_int(CL_API_CALL *PFN_clEnqueueCopyBufferToImage)(
357     cl_command_queue /* command_queue */, cl_mem /* src_buffer */,
358     cl_mem /* dst_image */, size_t /* src_offset */,
359     const size_t * /* dst_origin[3] */, const size_t * /* region[3] */,
360     cl_uint /* num_events_in_wait_list */,
361     const cl_event * /* event_wait_list */,
362     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
363 typedef void *(CL_API_CALL *PFN_clEnqueueMapBuffer)(
364     cl_command_queue /* command_queue */, cl_mem /* buffer */,
365     cl_bool /* blocking_map */, cl_map_flags /* map_flags */,
366     size_t /* offset */, size_t /* size */,
367     cl_uint /* num_events_in_wait_list */,
368     const cl_event * /* event_wait_list */, cl_event * /* event */,
369     cl_int * /* errcode_ret */)CL_API_SUFFIX__VERSION_1_0;
370 typedef void *(CL_API_CALL *PFN_clEnqueueMapImage)(
371     cl_command_queue /* command_queue */, cl_mem /* image */,
372     cl_bool /* blocking_map */, cl_map_flags /* map_flags */,
373     const size_t * /* origin[3] */, const size_t * /* region[3] */,
374     size_t * /* image_row_pitch */, size_t * /* image_slice_pitch */,
375     cl_uint /* num_events_in_wait_list */,
376     const cl_event * /* event_wait_list */, cl_event * /* event */,
377     cl_int * /* errcode_ret */)CL_API_SUFFIX__VERSION_1_0;
378 typedef cl_int(CL_API_CALL *PFN_clEnqueueUnmapMemObject)(
379     cl_command_queue /* command_queue */, cl_mem /* memobj */,
380     void * /* mapped_ptr */, cl_uint /* num_events_in_wait_list */,
381     const cl_event * /* event_wait_list */,
382     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
383 typedef cl_int(CL_API_CALL *PFN_clEnqueueMigrateMemObjects)(
384     cl_command_queue /* command_queue */, cl_uint /* num_mem_objects */,
385     const cl_mem * /* mem_objects */, cl_mem_migration_flags /* flags */,
386     cl_uint /* num_events_in_wait_list */,
387     const cl_event * /* event_wait_list */,
388     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
389 typedef cl_int(CL_API_CALL *PFN_clEnqueueNDRangeKernel)(
390     cl_command_queue /* command_queue */, cl_kernel /* kernel */,
391     cl_uint /* work_dim */, const size_t * /* global_work_offset */,
392     const size_t * /* global_work_size */, const size_t * /* local_work_size */,
393     cl_uint /* num_events_in_wait_list */,
394     const cl_event * /* event_wait_list */,
395     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
396 typedef cl_int(CL_API_CALL *PFN_clEnqueueNativeKernel)(
397     cl_command_queue /* command_queue */,
398     void(CL_CALLBACK * /*user_func*/)(void *), void * /* args */,
399     size_t /* cb_args */, cl_uint /* num_mem_objects */,
400     const cl_mem * /* mem_list */, const void ** /* args_mem_loc */,
401     cl_uint /* num_events_in_wait_list */,
402     const cl_event * /* event_wait_list */,
403     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
404 typedef cl_int(CL_API_CALL *PFN_clEnqueueMarkerWithWaitList)(
405     cl_command_queue /* command_queue */, cl_uint /* num_events_in_wait_list */,
406     const cl_event * /* event_wait_list */,
407     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
408 typedef cl_int(CL_API_CALL *PFN_clEnqueueBarrierWithWaitList)(
409     cl_command_queue /* command_queue */, cl_uint /* num_events_in_wait_list */,
410     const cl_event * /* event_wait_list */,
411     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
412 typedef cl_int(CL_API_CALL *PFN_clEnqueueSVMFree)(
413     cl_command_queue /* command_queue */, cl_uint /* num_svm_pointers */,
414     void *[] /* svm_pointers[] */,
415     void(CL_CALLBACK * /*pfn_free_func*/)(cl_command_queue /* queue */,
416                                           cl_uint /* num_svm_pointers */,
417                                           void *[] /* svm_pointers[] */,
418                                           void * /* user_data */),
419     void * /* user_data */, cl_uint /* num_events_in_wait_list */,
420     const cl_event * /* event_wait_list */,
421     cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
422 typedef cl_int(CL_API_CALL *PFN_clEnqueueSVMMemcpy)(
423     cl_command_queue /* command_queue */, cl_bool /* blocking_copy */,
424     void * /* dst_ptr */, const void * /* src_ptr */, size_t /* size */,
425     cl_uint /* num_events_in_wait_list */,
426     const cl_event * /* event_wait_list */,
427     cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
428 typedef cl_int(CL_API_CALL *PFN_clEnqueueSVMMemFill)(
429     cl_command_queue /* command_queue */, void * /* svm_ptr */,
430     const void * /* pattern */, size_t /* pattern_size */, size_t /* size */,
431     cl_uint /* num_events_in_wait_list */,
432     const cl_event * /* event_wait_list */,
433     cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
434 typedef cl_int(CL_API_CALL *PFN_clEnqueueSVMMap)(
435     cl_command_queue /* command_queue */, cl_bool /* blocking_map */,
436     cl_map_flags /* flags */, void * /* svm_ptr */, size_t /* size */,
437     cl_uint /* num_events_in_wait_list */,
438     const cl_event * /* event_wait_list */,
439     cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
440 typedef cl_int(CL_API_CALL *PFN_clEnqueueSVMUnmap)(
441     cl_command_queue /* command_queue */, void * /* svm_ptr */,
442     cl_uint /* num_events_in_wait_list */,
443     const cl_event * /* event_wait_list */,
444     cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
445 typedef void *(CL_API_CALL *PFN_clGetExtensionFunctionAddressForPlatform)(
446     cl_platform_id /* platform */,
447     const char * /* func_name */)CL_API_SUFFIX__VERSION_1_2;
448 typedef cl_mem(CL_API_CALL *PFN_clCreateImage2D)(
449     cl_context /* context */, cl_mem_flags /* flags */,
450     const cl_image_format * /* image_format */, size_t /* image_width */,
451     size_t /* image_height */, size_t /* image_row_pitch */,
452     void * /* host_ptr */, cl_int * /* errcode_ret */);
453 typedef cl_mem(CL_API_CALL *PFN_clCreateImage3D)(
454     cl_context /* context */, cl_mem_flags /* flags */,
455     const cl_image_format * /* image_format */, size_t /* image_width */,
456     size_t /* image_height */, size_t /* image_depth */,
457     size_t /* image_row_pitch */, size_t /* image_slice_pitch */,
458     void * /* host_ptr */, cl_int * /* errcode_ret */);
459 typedef cl_int(CL_API_CALL *PFN_clEnqueueMarker)(
460     cl_command_queue /* command_queue */, cl_event * /* event */);
461 typedef cl_int(CL_API_CALL *PFN_clEnqueueWaitForEvents)(
462     cl_command_queue /* command_queue */, cl_uint /* num_events */,
463     const cl_event * /* event_list */);
464 typedef cl_int(CL_API_CALL *PFN_clEnqueueBarrier)(
465     cl_command_queue /* command_queue */);
466 typedef cl_int(CL_API_CALL *PFN_clUnloadCompiler)();
467 typedef void *(CL_API_CALL *PFN_clGetExtensionFunctionAddress)(
468     const char * /* func_name */);
469 typedef cl_command_queue(CL_API_CALL *PFN_clCreateCommandQueue)(
470     cl_context /* context */, cl_device_id /* device */,
471     cl_command_queue_properties /* properties */, cl_int * /* errcode_ret */);
472 typedef cl_sampler(CL_API_CALL *PFN_clCreateSampler)(
473     cl_context /* context */, cl_bool /* normalized_coords */,
474     cl_addressing_mode /* addressing_mode */, cl_filter_mode /* filter_mode */,
475     cl_int * /* errcode_ret */);
476 typedef cl_int(CL_API_CALL *PFN_clEnqueueTask)(
477     cl_command_queue /* command_queue */, cl_kernel /* kernel */,
478     cl_uint /* num_events_in_wait_list */,
479     const cl_event * /* event_wait_list */, cl_event * /* event */);
480 
481 // OpenGL sharing
482 typedef cl_mem(CL_API_CALL *PFN_clCreateFromGLBuffer)(cl_context, cl_mem_flags,
483                                                       cl_GLuint, int *);
484 typedef cl_mem(CL_API_CALL *PFN_clCreateFromGLTexture)(
485     cl_context /* context */, cl_mem_flags /* flags */, cl_GLenum /* target */,
486     cl_GLint /* miplevel */, cl_GLuint /* texture */,
487     cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
488 typedef cl_int(CL_API_CALL *PFN_clEnqueueAcquireGLObjects)(
489     cl_command_queue /* command_queue */, cl_uint /* num_objects */,
490     const cl_mem * /* mem_objects */, cl_uint /* num_events_in_wait_list */,
491     const cl_event * /* event_wait_list */, cl_event * /* event */);
492 typedef cl_int(CL_API_CALL *PFN_clEnqueueReleaseGLObjects)(
493     cl_command_queue /* command_queue */, cl_uint /* num_objects */,
494     const cl_mem * /* mem_objects */, cl_uint /* num_events_in_wait_list */,
495     const cl_event * /* event_wait_list */,
496     cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
497 
498 // cl_khr_egl_event extension
499 
500 // CLeglDisplayKHR is an opaque handle to an EGLDisplay
501 typedef void *CLeglDisplayKHR;
502 
503 // CLeglSyncKHR is an opaque handle to an EGLSync object
504 typedef void *CLeglSyncKHR;
505 
506 typedef cl_event(CL_API_CALL *PFN_clCreateEventFromEGLSyncKHR)(
507     cl_context /* context */, CLeglSyncKHR /* sync */,
508     CLeglDisplayKHR /* display */, cl_int * /* errcode_ret */);
509 
510 // EGL sharing
511 typedef cl_mem(CL_API_CALL *PFN_clCreateFromEGLImageKHR)(
512     cl_context /*context*/, CLeglDisplayKHR /*display*/,
513     CLeglImageKHR /*image*/, cl_mem_flags /*flags*/,
514     const cl_egl_image_properties_khr * /*properties*/,
515     cl_int * /*errcode_ret*/);
516 typedef cl_int(CL_API_CALL *PFN_clEnqueueAcquireEGLObjectsKHR)(
517     cl_command_queue /*command_queue*/, cl_uint /*num_objects*/,
518     const cl_mem * /*mem_objects*/, cl_uint /*num_events_in_wait_list*/,
519     const cl_event * /*event_wait_list*/, cl_event * /*event*/);
520 typedef cl_int(CL_API_CALL *PFN_clEnqueueReleaseEGLObjectsKHR)(
521     cl_command_queue /*command_queue*/, cl_uint /*num_objects*/,
522     const cl_mem * /*mem_objects*/, cl_uint /*num_events_in_wait_list*/,
523     const cl_event * /*event_wait_list*/, cl_event * /*event*/);
524 
525 // cl_khr_command_buffer
526 typedef cl_command_buffer_khr(CL_API_CALL *PFN_clCreateCommandBufferKHR)(
527     cl_uint /*num_queues*/, const cl_command_queue * /*queues*/,
528     const cl_command_buffer_properties_khr * /*properties*/,
529     cl_int * /*errcode_ret*/);
530 
531 typedef cl_int(CL_API_CALL *PFN_clRetainCommandBufferKHR)(
532     cl_command_buffer_khr /*command_buffer*/);
533 
534 typedef cl_int(CL_API_CALL *PFN_clReleaseCommandBufferKHR)(
535     cl_command_buffer_khr /*command_buffer*/);
536 
537 typedef cl_int(CL_API_CALL *PFN_clFinalizeCommandBufferKHR)(
538     cl_command_buffer_khr /*command_buffer*/);
539 
540 typedef cl_int(CL_API_CALL *PFN_clEnqueueCommandBufferKHR)(
541     cl_uint /*num_queues*/, cl_command_queue * /*queues*/,
542     cl_command_buffer_khr /*command_buffer*/,
543     cl_uint /*num_events_in_wait_list*/, const cl_event * /*event_wait_list*/,
544     cl_event * /*event*/);
545 
546 typedef cl_int(CL_API_CALL *PFN_clCommandNDRangeKernelKHR)(
547     cl_command_buffer_khr /*command_buffer*/,
548     cl_command_queue /*command_queue*/,
549     const cl_ndrange_kernel_command_properties_khr * /*properties*/,
550     cl_kernel /*kernel*/, cl_uint /*work_dim*/,
551     const size_t * /*global_work_offset*/, const size_t * /*global_work_size*/,
552     const size_t * /*local_work_size*/,
553     cl_uint /*num_sync_points_in_wait_list*/,
554     const cl_sync_point_khr * /*sync_point_wait_list*/,
555     cl_sync_point_khr * /*sync_point*/,
556     cl_mutable_command_khr * /*mutable_handle*/);
557 
558 typedef cl_int(CL_API_CALL *PFN_clGetCommandBufferInfoKHR)(
559     cl_command_buffer_khr /*command_buffer*/,
560     cl_command_buffer_info_khr /*param_name*/, size_t /*param_value_size*/,
561     void * /*param_value*/, size_t * /*param_value_size_ret*/);
562 
563 extern PFN_clGetPlatformIDs clGetPlatformIDs;
564 extern PFN_clGetPlatformInfo clGetPlatformInfo;
565 extern PFN_clGetDeviceIDs clGetDeviceIDs;
566 extern PFN_clGetDeviceInfo clGetDeviceInfo;
567 extern PFN_clCreateSubDevices clCreateSubDevices;
568 extern PFN_clRetainDevice clRetainDevice;
569 extern PFN_clReleaseDevice clReleaseDevice;
570 extern PFN_clCreateContext clCreateContext;
571 extern PFN_clCreateContextFromType clCreateContextFromType;
572 extern PFN_clRetainContext clRetainContext;
573 extern PFN_clReleaseContext clReleaseContext;
574 extern PFN_clGetContextInfo clGetContextInfo;
575 extern PFN_clCreateCommandQueueWithProperties
576     clCreateCommandQueueWithProperties;
577 extern PFN_clRetainCommandQueue clRetainCommandQueue;
578 extern PFN_clReleaseCommandQueue clReleaseCommandQueue;
579 extern PFN_clGetCommandQueueInfo clGetCommandQueueInfo;
580 extern PFN_clCreateBuffer clCreateBuffer;
581 extern PFN_clCreateSubBuffer clCreateSubBuffer;
582 extern PFN_clCreateImage clCreateImage;
583 extern PFN_clCreatePipe clCreatePipe;
584 extern PFN_clRetainMemObject clRetainMemObject;
585 extern PFN_clReleaseMemObject clReleaseMemObject;
586 extern PFN_clGetSupportedImageFormats clGetSupportedImageFormats;
587 extern PFN_clGetMemObjectInfo clGetMemObjectInfo;
588 extern PFN_clGetImageInfo clGetImageInfo;
589 extern PFN_clGetPipeInfo clGetPipeInfo;
590 extern PFN_clSetMemObjectDestructorCallback clSetMemObjectDestructorCallback;
591 extern PFN_clSVMAlloc clSVMAlloc;
592 extern PFN_clSVMFree clSVMFree;
593 extern PFN_clCreateSamplerWithProperties clCreateSamplerWithProperties;
594 extern PFN_clRetainSampler clRetainSampler;
595 extern PFN_clReleaseSampler clReleaseSampler;
596 extern PFN_clGetSamplerInfo clGetSamplerInfo;
597 extern PFN_clCreateProgramWithSource clCreateProgramWithSource;
598 extern PFN_clCreateProgramWithBinary clCreateProgramWithBinary;
599 extern PFN_clCreateProgramWithBuiltInKernels clCreateProgramWithBuiltInKernels;
600 extern PFN_clRetainProgram clRetainProgram;
601 extern PFN_clReleaseProgram clReleaseProgram;
602 extern PFN_clBuildProgram clBuildProgram;
603 extern PFN_clCompileProgram clCompileProgram;
604 extern PFN_clLinkProgram clLinkProgram;
605 extern PFN_clUnloadPlatformCompiler clUnloadPlatformCompiler;
606 extern PFN_clGetProgramInfo clGetProgramInfo;
607 extern PFN_clGetProgramBuildInfo clGetProgramBuildInfo;
608 extern PFN_clCreateKernel clCreateKernel;
609 extern PFN_clCreateKernelsInProgram clCreateKernelsInProgram;
610 extern PFN_clRetainKernel clRetainKernel;
611 extern PFN_clReleaseKernel clReleaseKernel;
612 extern PFN_clSetKernelArg clSetKernelArg;
613 extern PFN_clSetKernelArgSVMPointer clSetKernelArgSVMPointer;
614 extern PFN_clSetKernelExecInfo clSetKernelExecInfo;
615 extern PFN_clGetKernelInfo clGetKernelInfo;
616 extern PFN_clGetKernelArgInfo clGetKernelArgInfo;
617 extern PFN_clGetKernelWorkGroupInfo clGetKernelWorkGroupInfo;
618 extern PFN_clWaitForEvents clWaitForEvents;
619 extern PFN_clGetEventInfo clGetEventInfo;
620 extern PFN_clCreateUserEvent clCreateUserEvent;
621 extern PFN_clRetainEvent clRetainEvent;
622 extern PFN_clReleaseEvent clReleaseEvent;
623 extern PFN_clSetUserEventStatus clSetUserEventStatus;
624 extern PFN_clSetEventCallback clSetEventCallback;
625 extern PFN_clGetEventProfilingInfo clGetEventProfilingInfo;
626 extern PFN_clFlush clFlush;
627 extern PFN_clFinish clFinish;
628 extern PFN_clEnqueueReadBuffer clEnqueueReadBuffer;
629 extern PFN_clEnqueueReadBufferRect clEnqueueReadBufferRect;
630 extern PFN_clEnqueueWriteBuffer clEnqueueWriteBuffer;
631 extern PFN_clEnqueueWriteBufferRect clEnqueueWriteBufferRect;
632 extern PFN_clEnqueueFillBuffer clEnqueueFillBuffer;
633 extern PFN_clEnqueueCopyBuffer clEnqueueCopyBuffer;
634 extern PFN_clEnqueueCopyBufferRect clEnqueueCopyBufferRect;
635 extern PFN_clEnqueueReadImage clEnqueueReadImage;
636 extern PFN_clEnqueueWriteImage clEnqueueWriteImage;
637 extern PFN_clEnqueueFillImage clEnqueueFillImage;
638 extern PFN_clEnqueueCopyImage clEnqueueCopyImage;
639 extern PFN_clEnqueueCopyImageToBuffer clEnqueueCopyImageToBuffer;
640 extern PFN_clEnqueueCopyBufferToImage clEnqueueCopyBufferToImage;
641 extern PFN_clEnqueueMapBuffer clEnqueueMapBuffer;
642 extern PFN_clEnqueueMapImage clEnqueueMapImage;
643 extern PFN_clEnqueueUnmapMemObject clEnqueueUnmapMemObject;
644 extern PFN_clEnqueueMigrateMemObjects clEnqueueMigrateMemObjects;
645 extern PFN_clEnqueueNDRangeKernel clEnqueueNDRangeKernel;
646 extern PFN_clEnqueueNativeKernel clEnqueueNativeKernel;
647 extern PFN_clEnqueueMarkerWithWaitList clEnqueueMarkerWithWaitList;
648 extern PFN_clEnqueueBarrierWithWaitList clEnqueueBarrierWithWaitList;
649 extern PFN_clEnqueueSVMFree clEnqueueSVMFree;
650 extern PFN_clEnqueueSVMMemcpy clEnqueueSVMMemcpy;
651 extern PFN_clEnqueueSVMMemFill clEnqueueSVMMemFill;
652 extern PFN_clEnqueueSVMMap clEnqueueSVMMap;
653 extern PFN_clEnqueueSVMUnmap clEnqueueSVMUnmap;
654 extern PFN_clGetExtensionFunctionAddressForPlatform
655     clGetExtensionFunctionAddressForPlatform;
656 extern PFN_clCreateImage2D clCreateImage2D;
657 extern PFN_clCreateImage3D clCreateImage3D;
658 extern PFN_clEnqueueMarker clEnqueueMarker;
659 extern PFN_clEnqueueWaitForEvents clEnqueueWaitForEvents;
660 extern PFN_clEnqueueBarrier clEnqueueBarrier;
661 extern PFN_clUnloadCompiler clUnloadCompiler;
662 extern PFN_clGetExtensionFunctionAddress clGetExtensionFunctionAddress;
663 extern PFN_clCreateCommandQueue clCreateCommandQueue;
664 extern PFN_clCreateSampler clCreateSampler;
665 extern PFN_clEnqueueTask clEnqueueTask;
666 
667 // OpenGL sharing
668 extern PFN_clCreateFromGLBuffer clCreateFromGLBuffer;
669 extern PFN_clCreateFromGLTexture clCreateFromGLTexture;
670 extern PFN_clEnqueueAcquireGLObjects clEnqueueAcquireGLObjects;
671 extern PFN_clEnqueueReleaseGLObjects clEnqueueReleaseGLObjects;
672 
673 // cl_khr_egl_event extension
674 extern PFN_clCreateEventFromEGLSyncKHR clCreateEventFromEGLSyncKHR;
675 
676 // EGL sharing
677 extern PFN_clCreateFromEGLImageKHR clCreateFromEGLImageKHR;
678 extern PFN_clEnqueueAcquireEGLObjectsKHR clEnqueueAcquireEGLObjectsKHR;
679 extern PFN_clEnqueueReleaseEGLObjectsKHR clEnqueueReleaseEGLObjectsKHR;
680 
681 // cl_khr_command_buffer extension
682 extern PFN_clCreateCommandBufferKHR clCreateCommandBufferKHR;
683 extern PFN_clRetainCommandBufferKHR clRetainCommandBufferKHR;
684 extern PFN_clReleaseCommandBufferKHR clReleaseCommandBufferKHR;
685 extern PFN_clFinalizeCommandBufferKHR clFinalizeCommandBufferKHR;
686 extern PFN_clEnqueueCommandBufferKHR clEnqueueCommandBufferKHR;
687 extern PFN_clCommandNDRangeKernelKHR clCommandNDRangeKernelKHR;
688 extern PFN_clGetCommandBufferInfoKHR clGetCommandBufferInfoKHR;
689 
690 // For convenient image creation
691 // It uses clCreateImage if it available (clCreateImage available since cl 1.2)
692 // otherwise it will use legacy clCreateImage2D
693 cl_mem CreateImage2DLegacy(cl_context context, cl_mem_flags flags,
694                            const cl_image_format *image_format,
695                            const cl_image_desc *image_desc, void *host_ptr,
696                            cl_int *errcode_ret);
697 
698 // It uses clCreateImage if it available (clCreateImage available since cl 1.2)
699 // otherwise it will use legacy clCreateImage3D
700 cl_mem CreateImage3DLegacy(cl_context context, cl_mem_flags flags,
701                            const cl_image_format *image_format,
702                            const cl_image_desc *image_desc, void *host_ptr,
703                            cl_int *errcode_ret);
704 
705 }  // namespace cl
706 }  // namespace gpu
707 }  // namespace tflite
708 
709 #endif  // TENSORFLOW_LITE_DELEGATES_GPU_CL_OPENCL_WRAPPER_H_
710