xref: /aosp_15_r20/external/OpenCL-ICD-Loader/scripts/icd_dispatch_generated.c.mako (revision 1cddb830dba8aa7c1cc1039338e56b3b9fa24952)
1<%
2# APIs to skip - they need to be done "manually":
3apiskip = {
4    'clGetPlatformIDs',                         # to query platforms
5    'clGetExtensionFunctionAddress',            # to return ICD-aware extensions
6    'clGetExtensionFunctionAddressForPlatform', # to return ICD-aware extensions
7    }
8
9apiinit = {
10    'clCreateContextFromType',
11    'clGetGLContextInfoKHR',
12    }
13# Handles, and mappings to errors when handles are invalid:
14apihandles = {
15    'cl_command_queue'  : 'CL_INVALID_COMMAND_QUEUE',
16    'cl_context'        : 'CL_INVALID_CONTEXT',
17    'cl_device_id'      : 'CL_INVALID_DEVICE',
18    'cl_event'          : 'CL_INVALID_EVENT',
19    'cl_kernel'         : 'CL_INVALID_KERNEL',
20    'cl_mem'            : 'CL_INVALID_MEM_OBJECT',
21    'cl_platform_id'    : 'CL_INVALID_PLATFORM',
22    'cl_program'        : 'CL_INVALID_PROGRAM',
23    'cl_sampler'        : 'CL_INVALID_SAMPLER',
24    }
25%>/*
26 * Copyright (c) 2012-2023 The Khronos Group Inc.
27 *
28 * Licensed under the Apache License, Version 2.0 (the "License");
29 * you may not use this file except in compliance with the License.
30 * You may obtain a copy of the License at
31 *
32 *     http://www.apache.org/licenses/LICENSE-2.0
33 *
34 * Unless required by applicable law or agreed to in writing, software
35 * distributed under the License is distributed on an "AS IS" BASIS,
36 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
37 * See the License for the specific language governing permissions and
38 * limitations under the License.
39 *
40 * OpenCL is a trademark of Apple Inc. used under license by Khronos.
41 */
42
43#include "icd.h"
44#include "icd_dispatch.h"
45
46#ifdef __cplusplus
47extern "C" {
48#endif
49
50///////////////////////////////////////////////////////////////////////////////
51// Core APIs:
52%for apis in coreapis.values():
53%for api in apis:
54%if not api.Name in apiskip:
55<%
56      handle = api.Params[0]
57      if handle.Type in apihandles:
58          invalid = apihandles[handle.Type]
59      else:
60          invalid = 'NULL'
61%>
62%for disp in [0, 1]:
63%  if disp == 1:
64#if defined(CL_ENABLE_LAYERS)
65%  endif
66${("CL_API_ENTRY", "static")[disp]} ${api.RetType} CL_API_CALL ${api.Name + ("", "_disp")[disp]}(
67%for i, param in enumerate(api.Params):
68%  if i < len(api.Params)-1:
69    ${param.Type} ${param.Name}${param.TypeEnd},
70%  else:
71    ${param.Type} ${param.Name}${param.TypeEnd})
72%  endif
73%endfor
74{
75%if api.Name in apiinit:
76    khrIcdInitialize();
77%endif
78%if disp == 0:
79#if defined(CL_ENABLE_LAYERS)
80    if (khrFirstLayer)
81%  if api.Name == "clSVMFree":
82    {
83        khrFirstLayer->dispatch.${api.Name}(
84%  else:
85        return khrFirstLayer->dispatch.${api.Name}(
86%  endif
87%for i, param in enumerate(api.Params):
88%  if i < len(api.Params)-1:
89            ${param.Name},
90%  else:
91            ${param.Name});
92%  endif
93%endfor
94%  if api.Name == "clSVMFree":
95    }
96    else
97%  endif
98#endif // defined(CL_ENABLE_LAYERS)
99%endif
100%if api.RetType in apihandles or api.RetType == "void*":
101## clCreateContext is a special case, since it calls through
102## the dispatch table via the first "device":
103%  if api.Name == "clCreateContext":
104    if (${api.Params[1].Name} == 0 || ${api.Params[2].Name} == NULL) {
105        KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(NULL, CL_INVALID_VALUE);
106    }
107    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(${api.Params[2].Name}[0], CL_INVALID_DEVICE);
108## clCreateContextFromType is a special case, since it calls
109## through a platform passed via properties:
110%  elif api.Name == "clCreateContextFromType":
111    cl_platform_id platform = NULL;
112    khrIcdContextPropertiesGetPlatform(properties, &platform);
113    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(platform, CL_INVALID_PLATFORM);
114## These APIs are special cases because they return a void*, but
115## do not nave an errcode_ret:
116%  elif api.Name == "clSVMAlloc" or api.Name == "clGetExtensionFunctionAddressForPlatform":
117    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${handle.Name}, NULL);
118%  else:
119    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(${handle.Name}, ${invalid});
120%  endif
121%elif api.Name == "clSVMFree":
122## clSVMFree has no return value or errcode_ret:
123    if (${handle.Name} != NULL)
124## clWaitForEvents is a special case, since it calls through
125## the dispatch table via the first "event":
126%elif api.Name == "clWaitForEvents":
127    if (${api.Params[0].Name} == 0 || ${api.Params[1].Name} == NULL) {
128        return CL_INVALID_VALUE;
129    }
130    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${api.Params[1].Name}[0], CL_INVALID_EVENT);
131%elif api.Name == "clUnloadCompiler":
132    // Nothing!
133%else:
134    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${handle.Name}, ${invalid});
135%endif
136%if api.Name == "clCreateContext":
137    return ${api.Params[2].Name}[0]->dispatch->${api.Name}(
138%elif api.Name == "clWaitForEvents":
139    return ${api.Params[1].Name}[0]->dispatch->${api.Name}(
140%elif api.Name == "clCreateContextFromType":
141    return platform->dispatch->${api.Name}(
142%elif api.Name == "clSVMFree":
143    ${handle.Name}->dispatch->${api.Name}(
144%elif api.Name == "clUnloadCompiler":
145    return CL_SUCCESS;
146%else:
147    return ${handle.Name}->dispatch->${api.Name}(
148%endif:
149%for i, param in enumerate(api.Params):
150%  if i < len(api.Params)-1:
151        ${param.Name},
152%  elif param.Name: # for clUnloadCompiler
153        ${param.Name});
154%  endif
155%endfor
156}
157%  if disp == 1:
158#endif // defined(CL_ENABLE_LAYERS)
159%  endif
160
161///////////////////////////////////////////////////////////////////////////////
162%endfor
163%else:
164#if defined(CL_ENABLE_LAYERS)
165extern ${api.RetType} CL_API_CALL ${api.Name + "_disp"}(
166%for i, param in enumerate(api.Params):
167%  if i < len(api.Params)-1:
168    ${param.Type} ${param.Name}${param.TypeEnd},
169%  else:
170    ${param.Type} ${param.Name}${param.TypeEnd}) ${api.Suffix};
171%  endif
172%endfor
173#endif // defined(CL_ENABLE_LAYERS)
174%endif
175%endfor
176%endfor
177<%
178icdextensions = [
179    'cl_ext_device_fission',
180    'cl_khr_d3d10_sharing',
181    'cl_khr_d3d11_sharing',
182    'cl_khr_dx9_media_sharing',
183    'cl_khr_egl_event',
184    'cl_khr_egl_image',
185    'cl_khr_gl_event',
186    'cl_khr_gl_sharing',
187    'cl_khr_subgroups'
188    ]
189win32extensions = {
190    'cl_khr_d3d10_sharing',
191    'cl_khr_d3d11_sharing',
192    'cl_khr_dx9_media_sharing',
193    }
194%>
195%for extension in icdextensions:
196<%
197    apis = extapis[extension]
198%>// ${extension}
199%if extension in win32extensions:
200
201#if defined(_WIN32)
202%endif
203%for api in apis:
204<%
205      handle = api.Params[0]
206      if handle.Type in apihandles:
207          invalid = apihandles[handle.Type]
208      else:
209          invalid = 'NULL'
210%>
211%for disp in [0, 1]:
212%  if disp == 1:
213#if defined(CL_ENABLE_LAYERS)
214%  endif
215${("CL_API_ENTRY", "static")[disp]} ${api.RetType} CL_API_CALL ${api.Name + ("", "_disp")[disp]}(
216%for i, param in enumerate(api.Params):
217%  if i < len(api.Params)-1:
218    ${param.Type} ${param.Name}${param.TypeEnd},
219%  else:
220    ${param.Type} ${param.Name}${param.TypeEnd})
221%  endif
222%endfor
223{
224%if disp == 0:
225#if defined(CL_ENABLE_LAYERS)
226    if (khrFirstLayer)
227        return khrFirstLayer->dispatch.${api.Name}(
228%for i, param in enumerate(api.Params):
229%  if i < len(api.Params)-1:
230            ${param.Name},
231%  else:
232            ${param.Name});
233%  endif
234%endfor
235#endif // defined(CL_ENABLE_LAYERS)
236%endif
237%if api.RetType in apihandles or api.RetType == "void*":
238%  if False:
239    // api.Name == "clXXX":  # There are currently no API special cases here.
240%  else:
241    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(${handle.Name}, ${invalid});
242    KHR_ICD_VALIDATE_POINTER_RETURN_HANDLE(${handle.Name}->dispatch->${api.Name});
243% endif
244%else:
245%  if api.Name == "clGetGLContextInfoKHR":
246    cl_platform_id platform = NULL;
247    khrIcdContextPropertiesGetPlatform(properties, &platform);
248    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
249    KHR_ICD_VALIDATE_POINTER_RETURN_ERROR(platform->dispatch->${api.Name});
250%  else:
251    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${handle.Name}, ${invalid});
252    KHR_ICD_VALIDATE_POINTER_RETURN_ERROR(${handle.Name}->dispatch->${api.Name});
253%  endif
254%endif
255%if api.Name == "clGetGLContextInfoKHR":
256    return platform->dispatch->${api.Name}(
257%else:
258    return ${handle.Name}->dispatch->${api.Name}(
259%endif
260%for i, param in enumerate(api.Params):
261%  if i < len(api.Params)-1:
262        ${param.Name},
263%  elif param.Name: # for clUnloadCompiler
264        ${param.Name});
265%  endif
266%endfor
267}
268%  if disp == 1:
269#endif // defined(CL_ENABLE_LAYERS)
270%  endif
271%endfor
272%endfor
273
274%if extension in win32extensions:
275#endif // defined(_WIN32)
276
277%endif
278///////////////////////////////////////////////////////////////////////////////
279
280%endfor
281#if defined(CL_ENABLE_LAYERS)
282struct _cl_icd_dispatch khrMasterDispatch = {
283    &clGetPlatformIDs_disp,
284    &clGetPlatformInfo_disp,
285    &clGetDeviceIDs_disp,
286    &clGetDeviceInfo_disp,
287    &clCreateContext_disp,
288    &clCreateContextFromType_disp,
289    &clRetainContext_disp,
290    &clReleaseContext_disp,
291    &clGetContextInfo_disp,
292    &clCreateCommandQueue_disp,
293    &clRetainCommandQueue_disp,
294    &clReleaseCommandQueue_disp,
295    &clGetCommandQueueInfo_disp,
296    &clSetCommandQueueProperty_disp,
297    &clCreateBuffer_disp,
298    &clCreateImage2D_disp,
299    &clCreateImage3D_disp,
300    &clRetainMemObject_disp,
301    &clReleaseMemObject_disp,
302    &clGetSupportedImageFormats_disp,
303    &clGetMemObjectInfo_disp,
304    &clGetImageInfo_disp,
305    &clCreateSampler_disp,
306    &clRetainSampler_disp,
307    &clReleaseSampler_disp,
308    &clGetSamplerInfo_disp,
309    &clCreateProgramWithSource_disp,
310    &clCreateProgramWithBinary_disp,
311    &clRetainProgram_disp,
312    &clReleaseProgram_disp,
313    &clBuildProgram_disp,
314    &clUnloadCompiler_disp,
315    &clGetProgramInfo_disp,
316    &clGetProgramBuildInfo_disp,
317    &clCreateKernel_disp,
318    &clCreateKernelsInProgram_disp,
319    &clRetainKernel_disp,
320    &clReleaseKernel_disp,
321    &clSetKernelArg_disp,
322    &clGetKernelInfo_disp,
323    &clGetKernelWorkGroupInfo_disp,
324    &clWaitForEvents_disp,
325    &clGetEventInfo_disp,
326    &clRetainEvent_disp,
327    &clReleaseEvent_disp,
328    &clGetEventProfilingInfo_disp,
329    &clFlush_disp,
330    &clFinish_disp,
331    &clEnqueueReadBuffer_disp,
332    &clEnqueueWriteBuffer_disp,
333    &clEnqueueCopyBuffer_disp,
334    &clEnqueueReadImage_disp,
335    &clEnqueueWriteImage_disp,
336    &clEnqueueCopyImage_disp,
337    &clEnqueueCopyImageToBuffer_disp,
338    &clEnqueueCopyBufferToImage_disp,
339    &clEnqueueMapBuffer_disp,
340    &clEnqueueMapImage_disp,
341    &clEnqueueUnmapMemObject_disp,
342    &clEnqueueNDRangeKernel_disp,
343    &clEnqueueTask_disp,
344    &clEnqueueNativeKernel_disp,
345    &clEnqueueMarker_disp,
346    &clEnqueueWaitForEvents_disp,
347    &clEnqueueBarrier_disp,
348    &clGetExtensionFunctionAddress_disp,
349    &clCreateFromGLBuffer_disp,
350    &clCreateFromGLTexture2D_disp,
351    &clCreateFromGLTexture3D_disp,
352    &clCreateFromGLRenderbuffer_disp,
353    &clGetGLObjectInfo_disp,
354    &clGetGLTextureInfo_disp,
355    &clEnqueueAcquireGLObjects_disp,
356    &clEnqueueReleaseGLObjects_disp,
357    &clGetGLContextInfoKHR_disp,
358
359  /* cl_khr_d3d10_sharing */
360#if defined(_WIN32)
361    &clGetDeviceIDsFromD3D10KHR_disp,
362    &clCreateFromD3D10BufferKHR_disp,
363    &clCreateFromD3D10Texture2DKHR_disp,
364    &clCreateFromD3D10Texture3DKHR_disp,
365    &clEnqueueAcquireD3D10ObjectsKHR_disp,
366    &clEnqueueReleaseD3D10ObjectsKHR_disp,
367#else
368    NULL,
369    NULL,
370    NULL,
371    NULL,
372    NULL,
373    NULL,
374#endif
375
376  /* OpenCL 1.1 */
377    &clSetEventCallback_disp,
378    &clCreateSubBuffer_disp,
379    &clSetMemObjectDestructorCallback_disp,
380    &clCreateUserEvent_disp,
381    &clSetUserEventStatus_disp,
382    &clEnqueueReadBufferRect_disp,
383    &clEnqueueWriteBufferRect_disp,
384    &clEnqueueCopyBufferRect_disp,
385
386  /* cl_ext_device_fission */
387    &clCreateSubDevicesEXT_disp,
388    &clRetainDeviceEXT_disp,
389    &clReleaseDeviceEXT_disp,
390
391  /* cl_khr_gl_event */
392    &clCreateEventFromGLsyncKHR_disp,
393
394  /* OpenCL 1.2 */
395    &clCreateSubDevices_disp,
396    &clRetainDevice_disp,
397    &clReleaseDevice_disp,
398    &clCreateImage_disp,
399    &clCreateProgramWithBuiltInKernels_disp,
400    &clCompileProgram_disp,
401    &clLinkProgram_disp,
402    &clUnloadPlatformCompiler_disp,
403    &clGetKernelArgInfo_disp,
404    &clEnqueueFillBuffer_disp,
405    &clEnqueueFillImage_disp,
406    &clEnqueueMigrateMemObjects_disp,
407    &clEnqueueMarkerWithWaitList_disp,
408    &clEnqueueBarrierWithWaitList_disp,
409    &clGetExtensionFunctionAddressForPlatform_disp,
410    &clCreateFromGLTexture_disp,
411
412  /* cl_khr_d3d11_sharing */
413#if defined(_WIN32)
414    &clGetDeviceIDsFromD3D11KHR_disp,
415    &clCreateFromD3D11BufferKHR_disp,
416    &clCreateFromD3D11Texture2DKHR_disp,
417    &clCreateFromD3D11Texture3DKHR_disp,
418    &clCreateFromDX9MediaSurfaceKHR_disp,
419    &clEnqueueAcquireD3D11ObjectsKHR_disp,
420    &clEnqueueReleaseD3D11ObjectsKHR_disp,
421#else
422    NULL,
423    NULL,
424    NULL,
425    NULL,
426    NULL,
427    NULL,
428    NULL,
429#endif
430
431  /* cl_khr_dx9_media_sharing */
432#if defined(_WIN32)
433    &clGetDeviceIDsFromDX9MediaAdapterKHR_disp,
434    &clEnqueueAcquireDX9MediaSurfacesKHR_disp,
435    &clEnqueueReleaseDX9MediaSurfacesKHR_disp,
436#else
437    NULL,
438    NULL,
439    NULL,
440#endif
441
442  /* cl_khr_egl_image */
443    &clCreateFromEGLImageKHR_disp,
444    &clEnqueueAcquireEGLObjectsKHR_disp,
445    &clEnqueueReleaseEGLObjectsKHR_disp,
446
447  /* cl_khr_egl_event */
448    &clCreateEventFromEGLSyncKHR_disp,
449
450  /* OpenCL 2.0 */
451    &clCreateCommandQueueWithProperties_disp,
452    &clCreatePipe_disp,
453    &clGetPipeInfo_disp,
454    &clSVMAlloc_disp,
455    &clSVMFree_disp,
456    &clEnqueueSVMFree_disp,
457    &clEnqueueSVMMemcpy_disp,
458    &clEnqueueSVMMemFill_disp,
459    &clEnqueueSVMMap_disp,
460    &clEnqueueSVMUnmap_disp,
461    &clCreateSamplerWithProperties_disp,
462    &clSetKernelArgSVMPointer_disp,
463    &clSetKernelExecInfo_disp,
464
465  /* cl_khr_sub_groups */
466    &clGetKernelSubGroupInfoKHR_disp,
467
468  /* OpenCL 2.1 */
469    &clCloneKernel_disp,
470    &clCreateProgramWithIL_disp,
471    &clEnqueueSVMMigrateMem_disp,
472    &clGetDeviceAndHostTimer_disp,
473    &clGetHostTimer_disp,
474    &clGetKernelSubGroupInfo_disp,
475    &clSetDefaultDeviceCommandQueue_disp,
476
477  /* OpenCL 2.2 */
478    &clSetProgramReleaseCallback_disp,
479    &clSetProgramSpecializationConstant_disp,
480
481  /* OpenCL 3.0 */
482    &clCreateBufferWithProperties_disp,
483    &clCreateImageWithProperties_disp,
484    &clSetContextDestructorCallback_disp
485};
486#endif // defined(CL_ENABLE_LAYERS)
487#ifdef __cplusplus
488}
489#endif
490