xref: /aosp_15_r20/external/OpenCL-ICD-Loader/loader/icd_dispatch.c (revision 1cddb830dba8aa7c1cc1039338e56b3b9fa24952)
1*1cddb830SAndroid Build Coastguard Worker /*
2*1cddb830SAndroid Build Coastguard Worker  * Copyright (c) 2012-2020 The Khronos Group Inc.
3*1cddb830SAndroid Build Coastguard Worker  *
4*1cddb830SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*1cddb830SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*1cddb830SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*1cddb830SAndroid Build Coastguard Worker  *
8*1cddb830SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*1cddb830SAndroid Build Coastguard Worker  *
10*1cddb830SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*1cddb830SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*1cddb830SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*1cddb830SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*1cddb830SAndroid Build Coastguard Worker  * limitations under the License.
15*1cddb830SAndroid Build Coastguard Worker  *
16*1cddb830SAndroid Build Coastguard Worker  * OpenCL is a trademark of Apple Inc. used under license by Khronos.
17*1cddb830SAndroid Build Coastguard Worker  */
18*1cddb830SAndroid Build Coastguard Worker 
19*1cddb830SAndroid Build Coastguard Worker #include "icd.h"
20*1cddb830SAndroid Build Coastguard Worker #include "icd_dispatch.h"
21*1cddb830SAndroid Build Coastguard Worker #include "icd_version.h"
22*1cddb830SAndroid Build Coastguard Worker 
23*1cddb830SAndroid Build Coastguard Worker #include <stdlib.h>
24*1cddb830SAndroid Build Coastguard Worker #include <string.h>
25*1cddb830SAndroid Build Coastguard Worker 
26*1cddb830SAndroid Build Coastguard Worker static clGetICDLoaderInfoOCLICD_t clGetICDLoaderInfoOCLICD;
27*1cddb830SAndroid Build Coastguard Worker cl_int CL_API_CALL
clGetICDLoaderInfoOCLICD(cl_icdl_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret)28*1cddb830SAndroid Build Coastguard Worker clGetICDLoaderInfoOCLICD(
29*1cddb830SAndroid Build Coastguard Worker     cl_icdl_info param_name,
30*1cddb830SAndroid Build Coastguard Worker     size_t       param_value_size,
31*1cddb830SAndroid Build Coastguard Worker     void *       param_value,
32*1cddb830SAndroid Build Coastguard Worker     size_t *     param_value_size_ret)
33*1cddb830SAndroid Build Coastguard Worker {
34*1cddb830SAndroid Build Coastguard Worker     static const char cl_icdl_OCL_VERSION[] = OPENCL_ICD_LOADER_OCL_VERSION_STRING;
35*1cddb830SAndroid Build Coastguard Worker     static const char cl_icdl_VERSION[]     = OPENCL_ICD_LOADER_VERSION_STRING;
36*1cddb830SAndroid Build Coastguard Worker     static const char cl_icdl_NAME[]        = OPENCL_ICD_LOADER_NAME_STRING;
37*1cddb830SAndroid Build Coastguard Worker     static const char cl_icdl_VENDOR[]      = OPENCL_ICD_LOADER_VENDOR_STRING;
38*1cddb830SAndroid Build Coastguard Worker     size_t            pvs;
39*1cddb830SAndroid Build Coastguard Worker     void *            pv;
40*1cddb830SAndroid Build Coastguard Worker 
41*1cddb830SAndroid Build Coastguard Worker #define KHR_ICD_CASE_STRING_PARAM_NAME(name)                                   \
42*1cddb830SAndroid Build Coastguard Worker     case CL_ICDL_ ## name:                                                     \
43*1cddb830SAndroid Build Coastguard Worker         pvs = strlen(cl_icdl_ ## name) + 1;                                    \
44*1cddb830SAndroid Build Coastguard Worker         pv = (void *)cl_icdl_ ## name;                                         \
45*1cddb830SAndroid Build Coastguard Worker         break
46*1cddb830SAndroid Build Coastguard Worker 
47*1cddb830SAndroid Build Coastguard Worker     switch (param_name) {
48*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CASE_STRING_PARAM_NAME(OCL_VERSION);
49*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CASE_STRING_PARAM_NAME(VERSION);
50*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CASE_STRING_PARAM_NAME(NAME);
51*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CASE_STRING_PARAM_NAME(VENDOR);
52*1cddb830SAndroid Build Coastguard Worker     default:
53*1cddb830SAndroid Build Coastguard Worker         return CL_INVALID_VALUE;
54*1cddb830SAndroid Build Coastguard Worker     }
55*1cddb830SAndroid Build Coastguard Worker 
56*1cddb830SAndroid Build Coastguard Worker #undef KHR_ICD_CASE_PARAM_NAME
57*1cddb830SAndroid Build Coastguard Worker 
58*1cddb830SAndroid Build Coastguard Worker     if (param_value) {
59*1cddb830SAndroid Build Coastguard Worker         if (param_value_size < pvs)
60*1cddb830SAndroid Build Coastguard Worker             return CL_INVALID_VALUE;
61*1cddb830SAndroid Build Coastguard Worker         memcpy(param_value, pv, pvs);
62*1cddb830SAndroid Build Coastguard Worker     }
63*1cddb830SAndroid Build Coastguard Worker     if (param_value_size_ret != NULL)
64*1cddb830SAndroid Build Coastguard Worker         *param_value_size_ret = pvs;
65*1cddb830SAndroid Build Coastguard Worker     return CL_SUCCESS;
66*1cddb830SAndroid Build Coastguard Worker }
67*1cddb830SAndroid Build Coastguard Worker 
khrIcdGetExtensionFunctionAddress(const char * function_name)68*1cddb830SAndroid Build Coastguard Worker static void* khrIcdGetExtensionFunctionAddress(const char* function_name)
69*1cddb830SAndroid Build Coastguard Worker {
70*1cddb830SAndroid Build Coastguard Worker // Most extensions, including multi-vendor KHR and EXT extensions,
71*1cddb830SAndroid Build Coastguard Worker // do not need to be ICD-aware and do not require any ICD loader
72*1cddb830SAndroid Build Coastguard Worker // modifications.  The KHR and EXT extensions below were added for
73*1cddb830SAndroid Build Coastguard Worker // backwards compatibility only.
74*1cddb830SAndroid Build Coastguard Worker #define KHR_ICD_CHECK_EXTENSION_FUNCTION(name)                                 \
75*1cddb830SAndroid Build Coastguard Worker     do                                                                         \
76*1cddb830SAndroid Build Coastguard Worker     {                                                                          \
77*1cddb830SAndroid Build Coastguard Worker         if (!strcmp(function_name, #name))                                     \
78*1cddb830SAndroid Build Coastguard Worker         {                                                                      \
79*1cddb830SAndroid Build Coastguard Worker             return (void*)(size_t)&name;                                       \
80*1cddb830SAndroid Build Coastguard Worker         }                                                                      \
81*1cddb830SAndroid Build Coastguard Worker     } while (0)
82*1cddb830SAndroid Build Coastguard Worker 
83*1cddb830SAndroid Build Coastguard Worker     // Functions supporting the creation of OpenCL Memory Objects
84*1cddb830SAndroid Build Coastguard Worker     // from OpenGL Objects (cl_apple_gl_sharing, cl_khr_gl_sharing)
85*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLBuffer);
86*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLTexture);
87*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLTexture2D);
88*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLTexture3D);
89*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLRenderbuffer);
90*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetGLObjectInfo);
91*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetGLTextureInfo);
92*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireGLObjects);
93*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseGLObjects);
94*1cddb830SAndroid Build Coastguard Worker 
95*1cddb830SAndroid Build Coastguard Worker     // cl_khr_gl_sharing
96*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetGLContextInfoKHR);
97*1cddb830SAndroid Build Coastguard Worker 
98*1cddb830SAndroid Build Coastguard Worker     // cl_khr_gl_event
99*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateEventFromGLsyncKHR);
100*1cddb830SAndroid Build Coastguard Worker 
101*1cddb830SAndroid Build Coastguard Worker #if defined(_WIN32)
102*1cddb830SAndroid Build Coastguard Worker     // cl_khr_d3d10_sharing
103*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetDeviceIDsFromD3D10KHR);
104*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D10BufferKHR);
105*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D10Texture2DKHR);
106*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D10Texture3DKHR);
107*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireD3D10ObjectsKHR);
108*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseD3D10ObjectsKHR);
109*1cddb830SAndroid Build Coastguard Worker     // cl_khr_d3d11_sharing
110*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetDeviceIDsFromD3D11KHR);
111*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D11BufferKHR);
112*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D11Texture2DKHR);
113*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D11Texture3DKHR);
114*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireD3D11ObjectsKHR);
115*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseD3D11ObjectsKHR);
116*1cddb830SAndroid Build Coastguard Worker     // cl_khr_dx9_media_sharing
117*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetDeviceIDsFromDX9MediaAdapterKHR);
118*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromDX9MediaSurfaceKHR);
119*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireDX9MediaSurfacesKHR);
120*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseDX9MediaSurfacesKHR);
121*1cddb830SAndroid Build Coastguard Worker #endif
122*1cddb830SAndroid Build Coastguard Worker 
123*1cddb830SAndroid Build Coastguard Worker     // cl_ext_device_fission
124*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateSubDevicesEXT);
125*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clRetainDeviceEXT);
126*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clReleaseDeviceEXT);
127*1cddb830SAndroid Build Coastguard Worker 
128*1cddb830SAndroid Build Coastguard Worker     // cl_khr_egl_image
129*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromEGLImageKHR);
130*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireEGLObjectsKHR);
131*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseEGLObjectsKHR);
132*1cddb830SAndroid Build Coastguard Worker 
133*1cddb830SAndroid Build Coastguard Worker     // cl_khr_egl_event
134*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateEventFromEGLSyncKHR);
135*1cddb830SAndroid Build Coastguard Worker 
136*1cddb830SAndroid Build Coastguard Worker     // cl_khr_sub_groups
137*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetKernelSubGroupInfoKHR);
138*1cddb830SAndroid Build Coastguard Worker 
139*1cddb830SAndroid Build Coastguard Worker     // cl_icdl
140*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetICDLoaderInfoOCLICD);
141*1cddb830SAndroid Build Coastguard Worker 
142*1cddb830SAndroid Build Coastguard Worker #undef KHR_ICD_CHECK_EXTENSION_FUNCTION
143*1cddb830SAndroid Build Coastguard Worker 
144*1cddb830SAndroid Build Coastguard Worker     return NULL;
145*1cddb830SAndroid Build Coastguard Worker }
146*1cddb830SAndroid Build Coastguard Worker 
147*1cddb830SAndroid Build Coastguard Worker #ifdef __cplusplus
148*1cddb830SAndroid Build Coastguard Worker extern "C" {
149*1cddb830SAndroid Build Coastguard Worker #endif
150*1cddb830SAndroid Build Coastguard Worker 
clGetPlatformIDs_body(cl_uint num_entries,cl_platform_id * platforms,cl_uint * num_platforms)151*1cddb830SAndroid Build Coastguard Worker static inline cl_int clGetPlatformIDs_body(
152*1cddb830SAndroid Build Coastguard Worker     cl_uint num_entries,
153*1cddb830SAndroid Build Coastguard Worker     cl_platform_id* platforms,
154*1cddb830SAndroid Build Coastguard Worker     cl_uint* num_platforms)
155*1cddb830SAndroid Build Coastguard Worker {
156*1cddb830SAndroid Build Coastguard Worker     KHRicdVendor* vendor = NULL;
157*1cddb830SAndroid Build Coastguard Worker     cl_uint i;
158*1cddb830SAndroid Build Coastguard Worker 
159*1cddb830SAndroid Build Coastguard Worker     if (!num_entries && platforms)
160*1cddb830SAndroid Build Coastguard Worker     {
161*1cddb830SAndroid Build Coastguard Worker         return CL_INVALID_VALUE;
162*1cddb830SAndroid Build Coastguard Worker     }
163*1cddb830SAndroid Build Coastguard Worker     if (!platforms && !num_platforms)
164*1cddb830SAndroid Build Coastguard Worker     {
165*1cddb830SAndroid Build Coastguard Worker         return CL_INVALID_VALUE;
166*1cddb830SAndroid Build Coastguard Worker     }
167*1cddb830SAndroid Build Coastguard Worker     // set num_platforms to 0 and set all platform pointers to NULL
168*1cddb830SAndroid Build Coastguard Worker     if (num_platforms)
169*1cddb830SAndroid Build Coastguard Worker     {
170*1cddb830SAndroid Build Coastguard Worker         *num_platforms = 0;
171*1cddb830SAndroid Build Coastguard Worker     }
172*1cddb830SAndroid Build Coastguard Worker     for (i = 0; i < num_entries && platforms; ++i)
173*1cddb830SAndroid Build Coastguard Worker     {
174*1cddb830SAndroid Build Coastguard Worker         platforms[i] = NULL;
175*1cddb830SAndroid Build Coastguard Worker     }
176*1cddb830SAndroid Build Coastguard Worker     // return error if we have no platforms
177*1cddb830SAndroid Build Coastguard Worker     if (!khrIcdVendors)
178*1cddb830SAndroid Build Coastguard Worker     {
179*1cddb830SAndroid Build Coastguard Worker         return CL_PLATFORM_NOT_FOUND_KHR;
180*1cddb830SAndroid Build Coastguard Worker     }
181*1cddb830SAndroid Build Coastguard Worker     // otherwise enumerate all platforms
182*1cddb830SAndroid Build Coastguard Worker     for (vendor = khrIcdVendors; vendor; vendor = vendor->next)
183*1cddb830SAndroid Build Coastguard Worker     {
184*1cddb830SAndroid Build Coastguard Worker         if (num_entries && platforms)
185*1cddb830SAndroid Build Coastguard Worker         {
186*1cddb830SAndroid Build Coastguard Worker             *(platforms++) = vendor->platform;
187*1cddb830SAndroid Build Coastguard Worker             --num_entries;
188*1cddb830SAndroid Build Coastguard Worker         }
189*1cddb830SAndroid Build Coastguard Worker         if (num_platforms)
190*1cddb830SAndroid Build Coastguard Worker         {
191*1cddb830SAndroid Build Coastguard Worker             ++(*num_platforms);
192*1cddb830SAndroid Build Coastguard Worker         }
193*1cddb830SAndroid Build Coastguard Worker     }
194*1cddb830SAndroid Build Coastguard Worker     return CL_SUCCESS;
195*1cddb830SAndroid Build Coastguard Worker }
196*1cddb830SAndroid Build Coastguard Worker 
clGetPlatformIDs_disp(cl_uint num_entries,cl_platform_id * platforms,cl_uint * num_platforms)197*1cddb830SAndroid Build Coastguard Worker cl_int CL_API_CALL clGetPlatformIDs_disp(
198*1cddb830SAndroid Build Coastguard Worker     cl_uint num_entries,
199*1cddb830SAndroid Build Coastguard Worker     cl_platform_id* platforms,
200*1cddb830SAndroid Build Coastguard Worker     cl_uint* num_platforms)
201*1cddb830SAndroid Build Coastguard Worker {
202*1cddb830SAndroid Build Coastguard Worker     return clGetPlatformIDs_body(
203*1cddb830SAndroid Build Coastguard Worker         num_entries,
204*1cddb830SAndroid Build Coastguard Worker         platforms,
205*1cddb830SAndroid Build Coastguard Worker         num_platforms);
206*1cddb830SAndroid Build Coastguard Worker }
207*1cddb830SAndroid Build Coastguard Worker 
clGetPlatformIDs(cl_uint num_entries,cl_platform_id * platforms,cl_uint * num_platforms)208*1cddb830SAndroid Build Coastguard Worker CL_API_ENTRY cl_int CL_API_CALL clGetPlatformIDs(
209*1cddb830SAndroid Build Coastguard Worker     cl_uint num_entries,
210*1cddb830SAndroid Build Coastguard Worker     cl_platform_id* platforms,
211*1cddb830SAndroid Build Coastguard Worker     cl_uint* num_platforms)
212*1cddb830SAndroid Build Coastguard Worker {
213*1cddb830SAndroid Build Coastguard Worker     // initialize the platforms (in case they have not been already)
214*1cddb830SAndroid Build Coastguard Worker     khrIcdInitialize();
215*1cddb830SAndroid Build Coastguard Worker 
216*1cddb830SAndroid Build Coastguard Worker #if defined(CL_ENABLE_LAYERS)
217*1cddb830SAndroid Build Coastguard Worker     if (khrFirstLayer)
218*1cddb830SAndroid Build Coastguard Worker         return khrFirstLayer->dispatch.clGetPlatformIDs(
219*1cddb830SAndroid Build Coastguard Worker             num_entries,
220*1cddb830SAndroid Build Coastguard Worker             platforms,
221*1cddb830SAndroid Build Coastguard Worker             num_platforms);
222*1cddb830SAndroid Build Coastguard Worker #endif // defined(CL_ENABLE_LAYERS)
223*1cddb830SAndroid Build Coastguard Worker     return clGetPlatformIDs_body(
224*1cddb830SAndroid Build Coastguard Worker         num_entries,
225*1cddb830SAndroid Build Coastguard Worker         platforms,
226*1cddb830SAndroid Build Coastguard Worker         num_platforms);
227*1cddb830SAndroid Build Coastguard Worker }
228*1cddb830SAndroid Build Coastguard Worker 
clGetExtensionFunctionAddress_body(const char * function_name)229*1cddb830SAndroid Build Coastguard Worker static inline void* clGetExtensionFunctionAddress_body(
230*1cddb830SAndroid Build Coastguard Worker     const char* function_name)
231*1cddb830SAndroid Build Coastguard Worker {
232*1cddb830SAndroid Build Coastguard Worker     void* function_address = NULL;
233*1cddb830SAndroid Build Coastguard Worker     size_t function_name_length = 0;
234*1cddb830SAndroid Build Coastguard Worker     KHRicdVendor* vendor = NULL;
235*1cddb830SAndroid Build Coastguard Worker 
236*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(function_name, NULL);
237*1cddb830SAndroid Build Coastguard Worker 
238*1cddb830SAndroid Build Coastguard Worker     // check if this is an ICD-aware extension
239*1cddb830SAndroid Build Coastguard Worker     function_address = khrIcdGetExtensionFunctionAddress(function_name);
240*1cddb830SAndroid Build Coastguard Worker     if (function_address)
241*1cddb830SAndroid Build Coastguard Worker     {
242*1cddb830SAndroid Build Coastguard Worker         return function_address;
243*1cddb830SAndroid Build Coastguard Worker     }
244*1cddb830SAndroid Build Coastguard Worker 
245*1cddb830SAndroid Build Coastguard Worker     // fall back to vendor extension detection
246*1cddb830SAndroid Build Coastguard Worker     function_name_length = strlen(function_name);
247*1cddb830SAndroid Build Coastguard Worker     for (vendor = khrIcdVendors; vendor; vendor = vendor->next)
248*1cddb830SAndroid Build Coastguard Worker     {
249*1cddb830SAndroid Build Coastguard Worker         size_t vendor_suffix_length = strlen(vendor->suffix);
250*1cddb830SAndroid Build Coastguard Worker         if (vendor_suffix_length <= function_name_length &&
251*1cddb830SAndroid Build Coastguard Worker             vendor_suffix_length > 0)
252*1cddb830SAndroid Build Coastguard Worker         {
253*1cddb830SAndroid Build Coastguard Worker             const char* function_suffix =
254*1cddb830SAndroid Build Coastguard Worker                 function_name + function_name_length - vendor_suffix_length;
255*1cddb830SAndroid Build Coastguard Worker             if (!strcmp(function_suffix, vendor->suffix))
256*1cddb830SAndroid Build Coastguard Worker             {
257*1cddb830SAndroid Build Coastguard Worker                 return vendor->clGetExtensionFunctionAddress(function_name);
258*1cddb830SAndroid Build Coastguard Worker             }
259*1cddb830SAndroid Build Coastguard Worker         }
260*1cddb830SAndroid Build Coastguard Worker     }
261*1cddb830SAndroid Build Coastguard Worker 
262*1cddb830SAndroid Build Coastguard Worker     return NULL;
263*1cddb830SAndroid Build Coastguard Worker }
264*1cddb830SAndroid Build Coastguard Worker 
clGetExtensionFunctionAddress_disp(const char * function_name)265*1cddb830SAndroid Build Coastguard Worker void* CL_API_CALL clGetExtensionFunctionAddress_disp(
266*1cddb830SAndroid Build Coastguard Worker     const char* function_name)
267*1cddb830SAndroid Build Coastguard Worker {
268*1cddb830SAndroid Build Coastguard Worker     return clGetExtensionFunctionAddress_body(
269*1cddb830SAndroid Build Coastguard Worker         function_name);
270*1cddb830SAndroid Build Coastguard Worker }
271*1cddb830SAndroid Build Coastguard Worker 
clGetExtensionFunctionAddress(const char * function_name)272*1cddb830SAndroid Build Coastguard Worker CL_API_ENTRY void* CL_API_CALL clGetExtensionFunctionAddress(
273*1cddb830SAndroid Build Coastguard Worker     const char* function_name)
274*1cddb830SAndroid Build Coastguard Worker {
275*1cddb830SAndroid Build Coastguard Worker     // make sure the ICD is initialized
276*1cddb830SAndroid Build Coastguard Worker     khrIcdInitialize();
277*1cddb830SAndroid Build Coastguard Worker 
278*1cddb830SAndroid Build Coastguard Worker #if defined(CL_ENABLE_LAYERS)
279*1cddb830SAndroid Build Coastguard Worker     if (khrFirstLayer)
280*1cddb830SAndroid Build Coastguard Worker         return khrFirstLayer->dispatch.clGetExtensionFunctionAddress(
281*1cddb830SAndroid Build Coastguard Worker             function_name);
282*1cddb830SAndroid Build Coastguard Worker #endif // defined(CL_ENABLE_LAYERS)
283*1cddb830SAndroid Build Coastguard Worker     return clGetExtensionFunctionAddress_body(
284*1cddb830SAndroid Build Coastguard Worker         function_name);
285*1cddb830SAndroid Build Coastguard Worker }
286*1cddb830SAndroid Build Coastguard Worker 
clGetExtensionFunctionAddressForPlatform_body(cl_platform_id platform,const char * function_name)287*1cddb830SAndroid Build Coastguard Worker static inline void* clGetExtensionFunctionAddressForPlatform_body(
288*1cddb830SAndroid Build Coastguard Worker     cl_platform_id platform,
289*1cddb830SAndroid Build Coastguard Worker     const char* function_name)
290*1cddb830SAndroid Build Coastguard Worker {
291*1cddb830SAndroid Build Coastguard Worker     void* function_address = NULL;
292*1cddb830SAndroid Build Coastguard Worker 
293*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(function_name, NULL);
294*1cddb830SAndroid Build Coastguard Worker 
295*1cddb830SAndroid Build Coastguard Worker     // check if this is an ICD-aware extension
296*1cddb830SAndroid Build Coastguard Worker     function_address = khrIcdGetExtensionFunctionAddress(function_name);
297*1cddb830SAndroid Build Coastguard Worker     if (function_address)
298*1cddb830SAndroid Build Coastguard Worker     {
299*1cddb830SAndroid Build Coastguard Worker         return function_address;
300*1cddb830SAndroid Build Coastguard Worker     }
301*1cddb830SAndroid Build Coastguard Worker 
302*1cddb830SAndroid Build Coastguard Worker     // This is not an ICD-aware extension, so call into the implementation
303*1cddb830SAndroid Build Coastguard Worker     // to get the extension function address.
304*1cddb830SAndroid Build Coastguard Worker 
305*1cddb830SAndroid Build Coastguard Worker     KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, NULL);
306*1cddb830SAndroid Build Coastguard Worker     return platform->dispatch->clGetExtensionFunctionAddressForPlatform(
307*1cddb830SAndroid Build Coastguard Worker         platform,
308*1cddb830SAndroid Build Coastguard Worker         function_name);
309*1cddb830SAndroid Build Coastguard Worker }
310*1cddb830SAndroid Build Coastguard Worker 
clGetExtensionFunctionAddressForPlatform_disp(cl_platform_id platform,const char * function_name)311*1cddb830SAndroid Build Coastguard Worker void* CL_API_CALL clGetExtensionFunctionAddressForPlatform_disp(
312*1cddb830SAndroid Build Coastguard Worker     cl_platform_id platform,
313*1cddb830SAndroid Build Coastguard Worker     const char* function_name)
314*1cddb830SAndroid Build Coastguard Worker {
315*1cddb830SAndroid Build Coastguard Worker     return clGetExtensionFunctionAddressForPlatform_body(
316*1cddb830SAndroid Build Coastguard Worker         platform,
317*1cddb830SAndroid Build Coastguard Worker         function_name);
318*1cddb830SAndroid Build Coastguard Worker }
319*1cddb830SAndroid Build Coastguard Worker 
clGetExtensionFunctionAddressForPlatform(cl_platform_id platform,const char * function_name)320*1cddb830SAndroid Build Coastguard Worker CL_API_ENTRY void* CL_API_CALL clGetExtensionFunctionAddressForPlatform(
321*1cddb830SAndroid Build Coastguard Worker     cl_platform_id platform,
322*1cddb830SAndroid Build Coastguard Worker     const char* function_name)
323*1cddb830SAndroid Build Coastguard Worker {
324*1cddb830SAndroid Build Coastguard Worker     // make sure the ICD is initialized
325*1cddb830SAndroid Build Coastguard Worker     khrIcdInitialize();
326*1cddb830SAndroid Build Coastguard Worker #if defined(CL_ENABLE_LAYERS)
327*1cddb830SAndroid Build Coastguard Worker     if (khrFirstLayer)
328*1cddb830SAndroid Build Coastguard Worker         return khrFirstLayer->dispatch.clGetExtensionFunctionAddressForPlatform(
329*1cddb830SAndroid Build Coastguard Worker             platform,
330*1cddb830SAndroid Build Coastguard Worker             function_name);
331*1cddb830SAndroid Build Coastguard Worker #endif // defined(CL_ENABLE_LAYERS)
332*1cddb830SAndroid Build Coastguard Worker     return clGetExtensionFunctionAddressForPlatform_body(
333*1cddb830SAndroid Build Coastguard Worker         platform,
334*1cddb830SAndroid Build Coastguard Worker         function_name);
335*1cddb830SAndroid Build Coastguard Worker }
336*1cddb830SAndroid Build Coastguard Worker 
337*1cddb830SAndroid Build Coastguard Worker #ifdef __cplusplus
338*1cddb830SAndroid Build Coastguard Worker }
339*1cddb830SAndroid Build Coastguard Worker #endif
340