xref: /aosp_15_r20/external/OpenCL-ICD-Loader/test/driver_stub/icd.c (revision 1cddb830dba8aa7c1cc1039338e56b3b9fa24952)
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <assert.h>
5 #include "icd_structs.h"
6 
7 #define CL_USE_DEPRECATED_OPENCL_1_0_APIS
8 #define CL_USE_DEPRECATED_OPENCL_1_1_APIS
9 #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
10 #define CL_USE_DEPRECATED_OPENCL_2_0_APIS
11 #define CL_USE_DEPRECATED_OPENCL_2_1_APIS
12 #define CL_USE_DEPRECATED_OPENCL_2_2_APIS
13 
14 // Need to rename all CL API functions to prevent ICD loader functions calling
15 // themselves via the dispatch table. Include this before cl headers.
16 #include "rename_api.h"
17 
18 #include "CL/cl.h"
19 #include "CL/cl_gl.h"
20 
21 /*
22  * Prototypes for deprecated functions no longer present in cl.h
23  */
24 extern CL_API_ENTRY cl_int CL_API_CALL
25 clSetCommandQueueProperty(cl_command_queue              /* command_queue */,
26                           cl_command_queue_properties   /* properties */,
27                           cl_bool                       /* enable */,
28                           cl_command_queue_properties * /* old_properties */);
29 
30 #define ICD_DISPATCH_TABLE_ENTRY(fn) \
31     assert(dispatchTable->entryCount < 256); \
32     dispatchTable->entries[dispatchTable->entryCount++] = (void*)(intptr_t)(fn)
33 
cliIcdDispatchTableCreate(CLIicdDispatchTable ** outDispatchTable)34 cl_int cliIcdDispatchTableCreate(CLIicdDispatchTable **outDispatchTable)
35 {
36     CLIicdDispatchTable *dispatchTable = NULL;
37     cl_int result = CL_SUCCESS;
38 
39     // allocate the public handle
40     dispatchTable = (CLIicdDispatchTable *) malloc(sizeof(*dispatchTable));
41     if (!dispatchTable) {
42         result = CL_OUT_OF_HOST_MEMORY;
43         goto Error;
44     }
45     memset(dispatchTable, 0, sizeof(*dispatchTable));
46 
47     // OpenCL 1.0
48     ICD_DISPATCH_TABLE_ENTRY ( clGetPlatformIDs              );
49     ICD_DISPATCH_TABLE_ENTRY ( clGetPlatformInfo             );
50     ICD_DISPATCH_TABLE_ENTRY ( clGetDeviceIDs                );
51     ICD_DISPATCH_TABLE_ENTRY ( clGetDeviceInfo               );
52     ICD_DISPATCH_TABLE_ENTRY ( clCreateContext               );
53     ICD_DISPATCH_TABLE_ENTRY ( clCreateContextFromType       );
54     ICD_DISPATCH_TABLE_ENTRY ( clRetainContext               );
55     ICD_DISPATCH_TABLE_ENTRY ( clReleaseContext              );
56     ICD_DISPATCH_TABLE_ENTRY ( clGetContextInfo              );
57     ICD_DISPATCH_TABLE_ENTRY ( clCreateCommandQueue          );
58     ICD_DISPATCH_TABLE_ENTRY ( clRetainCommandQueue          );
59     ICD_DISPATCH_TABLE_ENTRY ( clReleaseCommandQueue         );
60     ICD_DISPATCH_TABLE_ENTRY ( clGetCommandQueueInfo         );
61     ICD_DISPATCH_TABLE_ENTRY ( clSetCommandQueueProperty     );
62     ICD_DISPATCH_TABLE_ENTRY ( clCreateBuffer                );
63     ICD_DISPATCH_TABLE_ENTRY ( clCreateImage2D               );
64     ICD_DISPATCH_TABLE_ENTRY ( clCreateImage3D               );
65     ICD_DISPATCH_TABLE_ENTRY ( clRetainMemObject             );
66     ICD_DISPATCH_TABLE_ENTRY ( clReleaseMemObject            );
67     ICD_DISPATCH_TABLE_ENTRY ( clGetSupportedImageFormats    );
68     ICD_DISPATCH_TABLE_ENTRY ( clGetMemObjectInfo            );
69     ICD_DISPATCH_TABLE_ENTRY ( clGetImageInfo                );
70     ICD_DISPATCH_TABLE_ENTRY ( clCreateSampler               );
71     ICD_DISPATCH_TABLE_ENTRY ( clRetainSampler               );
72     ICD_DISPATCH_TABLE_ENTRY ( clReleaseSampler              );
73     ICD_DISPATCH_TABLE_ENTRY ( clGetSamplerInfo              );
74     ICD_DISPATCH_TABLE_ENTRY ( clCreateProgramWithSource     );
75     ICD_DISPATCH_TABLE_ENTRY ( clCreateProgramWithBinary     );
76     ICD_DISPATCH_TABLE_ENTRY ( clRetainProgram               );
77     ICD_DISPATCH_TABLE_ENTRY ( clReleaseProgram              );
78     ICD_DISPATCH_TABLE_ENTRY ( clBuildProgram                );
79     ICD_DISPATCH_TABLE_ENTRY ( clUnloadCompiler              );
80     ICD_DISPATCH_TABLE_ENTRY ( clGetProgramInfo              );
81     ICD_DISPATCH_TABLE_ENTRY ( clGetProgramBuildInfo         );
82     ICD_DISPATCH_TABLE_ENTRY ( clCreateKernel                );
83     ICD_DISPATCH_TABLE_ENTRY ( clCreateKernelsInProgram      );
84     ICD_DISPATCH_TABLE_ENTRY ( clRetainKernel                );
85     ICD_DISPATCH_TABLE_ENTRY ( clReleaseKernel               );
86     ICD_DISPATCH_TABLE_ENTRY ( clSetKernelArg                );
87     ICD_DISPATCH_TABLE_ENTRY ( clGetKernelInfo               );
88     ICD_DISPATCH_TABLE_ENTRY ( clGetKernelWorkGroupInfo      );
89     ICD_DISPATCH_TABLE_ENTRY ( clWaitForEvents               );
90     ICD_DISPATCH_TABLE_ENTRY ( clGetEventInfo                );
91     ICD_DISPATCH_TABLE_ENTRY ( clRetainEvent                 );
92     ICD_DISPATCH_TABLE_ENTRY ( clReleaseEvent                );
93     ICD_DISPATCH_TABLE_ENTRY ( clGetEventProfilingInfo       );
94     ICD_DISPATCH_TABLE_ENTRY ( clFlush                       );
95     ICD_DISPATCH_TABLE_ENTRY ( clFinish                      );
96     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReadBuffer           );
97     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueWriteBuffer          );
98     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyBuffer           );
99     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReadImage            );
100     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueWriteImage           );
101     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyImage            );
102     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyImageToBuffer    );
103     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyBufferToImage    );
104     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMapBuffer            );
105     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMapImage             );
106     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueUnmapMemObject       );
107     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueNDRangeKernel        );
108     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueTask                 );
109     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueNativeKernel         );
110     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMarker               );
111     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueWaitForEvents        );
112     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueBarrier              );
113     ICD_DISPATCH_TABLE_ENTRY ( clGetExtensionFunctionAddress );
114     ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLBuffer          );
115     ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLTexture2D       );
116     ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLTexture3D       );
117     ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLRenderbuffer    );
118     ICD_DISPATCH_TABLE_ENTRY ( clGetGLObjectInfo             );
119     ICD_DISPATCH_TABLE_ENTRY ( clGetGLTextureInfo            );
120     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueAcquireGLObjects     );
121     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReleaseGLObjects     );
122 
123     // cl_khr_gl_sharing
124     ICD_DISPATCH_TABLE_ENTRY ( clGetGLContextInfoKHR         );
125 
126     // cl_khr_d3d10_sharing (windows-only)
127 #if 0 && defined(_WIN32)
128     ICD_DISPATCH_TABLE_ENTRY ( clGetDeviceIDsFromD3D10KHR      );
129     ICD_DISPATCH_TABLE_ENTRY ( clCreateFromD3D10BufferKHR      );
130     ICD_DISPATCH_TABLE_ENTRY ( clCreateFromD3D10Texture2DKHR   );
131     ICD_DISPATCH_TABLE_ENTRY ( clCreateFromD3D10Texture3DKHR   );
132     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueAcquireD3D10ObjectsKHR );
133     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReleaseD3D10ObjectsKHR );
134 #else
135     ICD_DISPATCH_TABLE_ENTRY( NULL );
136     ICD_DISPATCH_TABLE_ENTRY( NULL );
137     ICD_DISPATCH_TABLE_ENTRY( NULL );
138     ICD_DISPATCH_TABLE_ENTRY( NULL );
139     ICD_DISPATCH_TABLE_ENTRY( NULL );
140     ICD_DISPATCH_TABLE_ENTRY( NULL );
141 #endif
142 
143     // OpenCL 1.1
144     ICD_DISPATCH_TABLE_ENTRY ( clSetEventCallback);
145     ICD_DISPATCH_TABLE_ENTRY ( clCreateSubBuffer);
146     ICD_DISPATCH_TABLE_ENTRY ( clSetMemObjectDestructorCallback);
147     ICD_DISPATCH_TABLE_ENTRY ( clCreateUserEvent);
148     ICD_DISPATCH_TABLE_ENTRY ( clSetUserEventStatus);
149     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReadBufferRect);
150     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueWriteBufferRect);
151     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyBufferRect);
152 
153     /* cl_ext_device_fission */
154     ICD_DISPATCH_TABLE_ENTRY ( /*clCreateSubDevicesEXT*/NULL);
155     ICD_DISPATCH_TABLE_ENTRY ( /*clRetainDeviceEXT*/ NULL);
156     ICD_DISPATCH_TABLE_ENTRY ( /*clReleaseDevice*/NULL);
157 
158     /* cl_khr_gl_event */
159     ICD_DISPATCH_TABLE_ENTRY ( clCreateEventFromGLsyncKHR);
160 
161     /* OpenCL 1.2 */
162     ICD_DISPATCH_TABLE_ENTRY ( clCreateSubDevices);
163     ICD_DISPATCH_TABLE_ENTRY ( clRetainDevice);
164     ICD_DISPATCH_TABLE_ENTRY ( clReleaseDevice);
165     ICD_DISPATCH_TABLE_ENTRY ( clCreateImage);
166     ICD_DISPATCH_TABLE_ENTRY ( clCreateProgramWithBuiltInKernels);
167     ICD_DISPATCH_TABLE_ENTRY ( clCompileProgram);
168     ICD_DISPATCH_TABLE_ENTRY ( clLinkProgram);
169     ICD_DISPATCH_TABLE_ENTRY ( clUnloadPlatformCompiler);
170     ICD_DISPATCH_TABLE_ENTRY ( clGetKernelArgInfo);
171     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueFillBuffer);
172     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueFillImage);
173     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMigrateMemObjects);
174     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMarkerWithWaitList);
175     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueBarrierWithWaitList);
176     ICD_DISPATCH_TABLE_ENTRY ( clGetExtensionFunctionAddressForPlatform);
177     ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLTexture);
178 
179     /* cl_khr_d3d11_sharing */
180     ICD_DISPATCH_TABLE_ENTRY( NULL );
181     ICD_DISPATCH_TABLE_ENTRY( NULL );
182     ICD_DISPATCH_TABLE_ENTRY( NULL );
183     ICD_DISPATCH_TABLE_ENTRY( NULL );
184     ICD_DISPATCH_TABLE_ENTRY( NULL );
185     ICD_DISPATCH_TABLE_ENTRY( NULL );
186     ICD_DISPATCH_TABLE_ENTRY( NULL );
187 
188     /* cl_khr_dx9_media_sharing */
189     ICD_DISPATCH_TABLE_ENTRY( NULL );
190     ICD_DISPATCH_TABLE_ENTRY( NULL );
191     ICD_DISPATCH_TABLE_ENTRY( NULL );
192 
193     /* cl_khr_egl_image */
194     ICD_DISPATCH_TABLE_ENTRY( NULL );
195     ICD_DISPATCH_TABLE_ENTRY( NULL );
196     ICD_DISPATCH_TABLE_ENTRY( NULL );
197 
198     /* cl_khr_egl_event */
199     ICD_DISPATCH_TABLE_ENTRY( NULL );
200 
201     /* OpenCL 2.0 */
202     ICD_DISPATCH_TABLE_ENTRY( NULL );
203     ICD_DISPATCH_TABLE_ENTRY( NULL );
204     ICD_DISPATCH_TABLE_ENTRY( NULL );
205     ICD_DISPATCH_TABLE_ENTRY( NULL );
206     ICD_DISPATCH_TABLE_ENTRY( NULL );
207     ICD_DISPATCH_TABLE_ENTRY( NULL );
208     ICD_DISPATCH_TABLE_ENTRY( NULL );
209     ICD_DISPATCH_TABLE_ENTRY( NULL );
210     ICD_DISPATCH_TABLE_ENTRY( NULL );
211     ICD_DISPATCH_TABLE_ENTRY( NULL );
212     ICD_DISPATCH_TABLE_ENTRY( NULL );
213     ICD_DISPATCH_TABLE_ENTRY( NULL );
214     ICD_DISPATCH_TABLE_ENTRY( NULL );
215 
216     /* cl_khr_sub_groups */
217     ICD_DISPATCH_TABLE_ENTRY( NULL );
218 
219     /* OpenCL 2.1 */
220     ICD_DISPATCH_TABLE_ENTRY( NULL );
221     ICD_DISPATCH_TABLE_ENTRY( NULL );
222     ICD_DISPATCH_TABLE_ENTRY( NULL );
223     ICD_DISPATCH_TABLE_ENTRY( NULL );
224     ICD_DISPATCH_TABLE_ENTRY( NULL );
225     ICD_DISPATCH_TABLE_ENTRY( NULL );
226     ICD_DISPATCH_TABLE_ENTRY( NULL );
227 
228     /* OpenCL 2.2 */
229     ICD_DISPATCH_TABLE_ENTRY( NULL );
230     ICD_DISPATCH_TABLE_ENTRY( NULL );
231 
232     /* OpenCL 3.0 */
233     ICD_DISPATCH_TABLE_ENTRY ( clCreateBufferWithProperties );
234     ICD_DISPATCH_TABLE_ENTRY ( clCreateImageWithProperties );
235     ICD_DISPATCH_TABLE_ENTRY ( clSetContextDestructorCallback );
236 
237     // return success
238     *outDispatchTable = dispatchTable;
239     return CL_SUCCESS;
240 
241 Error:
242     return result;
243 }
244 
245 void
cliIcdDispatchTableDestroy(CLIicdDispatchTable * dispatchTable)246 cliIcdDispatchTableDestroy(CLIicdDispatchTable *dispatchTable)
247 {
248     free(dispatchTable);
249 }
250