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