xref: /aosp_15_r20/external/OpenCL-ICD-Loader/loader/icd.h (revision 1cddb830dba8aa7c1cc1039338e56b3b9fa24952)
1*1cddb830SAndroid Build Coastguard Worker /*
2*1cddb830SAndroid Build Coastguard Worker  * Copyright (c) 2016-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 #ifndef _ICD_H_
20*1cddb830SAndroid Build Coastguard Worker #define _ICD_H_
21*1cddb830SAndroid Build Coastguard Worker 
22*1cddb830SAndroid Build Coastguard Worker #include "icd_platform.h"
23*1cddb830SAndroid Build Coastguard Worker 
24*1cddb830SAndroid Build Coastguard Worker #ifndef CL_USE_DEPRECATED_OPENCL_1_0_APIS
25*1cddb830SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_1_0_APIS
26*1cddb830SAndroid Build Coastguard Worker #endif
27*1cddb830SAndroid Build Coastguard Worker 
28*1cddb830SAndroid Build Coastguard Worker #ifndef CL_USE_DEPRECATED_OPENCL_1_1_APIS
29*1cddb830SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_1_1_APIS
30*1cddb830SAndroid Build Coastguard Worker #endif
31*1cddb830SAndroid Build Coastguard Worker 
32*1cddb830SAndroid Build Coastguard Worker #ifndef CL_USE_DEPRECATED_OPENCL_1_2_APIS
33*1cddb830SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
34*1cddb830SAndroid Build Coastguard Worker #endif
35*1cddb830SAndroid Build Coastguard Worker 
36*1cddb830SAndroid Build Coastguard Worker #ifndef CL_USE_DEPRECATED_OPENCL_2_0_APIS
37*1cddb830SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_2_0_APIS
38*1cddb830SAndroid Build Coastguard Worker #endif
39*1cddb830SAndroid Build Coastguard Worker 
40*1cddb830SAndroid Build Coastguard Worker #ifndef CL_USE_DEPRECATED_OPENCL_2_1_APIS
41*1cddb830SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_2_1_APIS
42*1cddb830SAndroid Build Coastguard Worker #endif
43*1cddb830SAndroid Build Coastguard Worker 
44*1cddb830SAndroid Build Coastguard Worker #ifndef CL_USE_DEPRECATED_OPENCL_2_2_APIS
45*1cddb830SAndroid Build Coastguard Worker #define CL_USE_DEPRECATED_OPENCL_2_2_APIS
46*1cddb830SAndroid Build Coastguard Worker #endif
47*1cddb830SAndroid Build Coastguard Worker 
48*1cddb830SAndroid Build Coastguard Worker #include <CL/cl.h>
49*1cddb830SAndroid Build Coastguard Worker #include <CL/cl_ext.h>
50*1cddb830SAndroid Build Coastguard Worker #include <CL/cl_icd.h>
51*1cddb830SAndroid Build Coastguard Worker #include <stdio.h>
52*1cddb830SAndroid Build Coastguard Worker 
53*1cddb830SAndroid Build Coastguard Worker /*
54*1cddb830SAndroid Build Coastguard Worker  * type definitions
55*1cddb830SAndroid Build Coastguard Worker  */
56*1cddb830SAndroid Build Coastguard Worker 
57*1cddb830SAndroid Build Coastguard Worker typedef cl_int (CL_API_CALL *pfn_clIcdGetPlatformIDs)(
58*1cddb830SAndroid Build Coastguard Worker     cl_uint num_entries,
59*1cddb830SAndroid Build Coastguard Worker     cl_platform_id *platforms,
60*1cddb830SAndroid Build Coastguard Worker     cl_uint *num_platforms) CL_API_SUFFIX__VERSION_1_0;
61*1cddb830SAndroid Build Coastguard Worker 
62*1cddb830SAndroid Build Coastguard Worker typedef cl_int (CL_API_CALL *pfn_clGetPlatformInfo)(
63*1cddb830SAndroid Build Coastguard Worker     cl_platform_id   platform,
64*1cddb830SAndroid Build Coastguard Worker     cl_platform_info param_name,
65*1cddb830SAndroid Build Coastguard Worker     size_t           param_value_size,
66*1cddb830SAndroid Build Coastguard Worker     void *           param_value,
67*1cddb830SAndroid Build Coastguard Worker     size_t *         param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
68*1cddb830SAndroid Build Coastguard Worker 
69*1cddb830SAndroid Build Coastguard Worker typedef void *(CL_API_CALL *pfn_clGetExtensionFunctionAddress)(
70*1cddb830SAndroid Build Coastguard Worker     const char *function_name)  CL_API_SUFFIX__VERSION_1_0;
71*1cddb830SAndroid Build Coastguard Worker 
72*1cddb830SAndroid Build Coastguard Worker typedef struct KHRicdVendorRec KHRicdVendor;
73*1cddb830SAndroid Build Coastguard Worker 
74*1cddb830SAndroid Build Coastguard Worker /*
75*1cddb830SAndroid Build Coastguard Worker  * KHRicdVendor
76*1cddb830SAndroid Build Coastguard Worker  *
77*1cddb830SAndroid Build Coastguard Worker  * Data for a single ICD vendor platform.
78*1cddb830SAndroid Build Coastguard Worker  */
79*1cddb830SAndroid Build Coastguard Worker struct KHRicdVendorRec
80*1cddb830SAndroid Build Coastguard Worker {
81*1cddb830SAndroid Build Coastguard Worker     // the loaded library object (true type varies on Linux versus Windows)
82*1cddb830SAndroid Build Coastguard Worker     void *library;
83*1cddb830SAndroid Build Coastguard Worker 
84*1cddb830SAndroid Build Coastguard Worker     // the extension suffix for this platform
85*1cddb830SAndroid Build Coastguard Worker     char *suffix;
86*1cddb830SAndroid Build Coastguard Worker 
87*1cddb830SAndroid Build Coastguard Worker     // function pointer to the ICD platform IDs extracted from the library
88*1cddb830SAndroid Build Coastguard Worker     pfn_clGetExtensionFunctionAddress clGetExtensionFunctionAddress;
89*1cddb830SAndroid Build Coastguard Worker 
90*1cddb830SAndroid Build Coastguard Worker     // the platform retrieved from clGetIcdPlatformIDsKHR
91*1cddb830SAndroid Build Coastguard Worker     cl_platform_id platform;
92*1cddb830SAndroid Build Coastguard Worker 
93*1cddb830SAndroid Build Coastguard Worker     // next vendor in the list vendors
94*1cddb830SAndroid Build Coastguard Worker     KHRicdVendor *next;
95*1cddb830SAndroid Build Coastguard Worker };
96*1cddb830SAndroid Build Coastguard Worker 
97*1cddb830SAndroid Build Coastguard Worker // the global state
98*1cddb830SAndroid Build Coastguard Worker extern KHRicdVendor * khrIcdVendors;
99*1cddb830SAndroid Build Coastguard Worker 
100*1cddb830SAndroid Build Coastguard Worker extern int khrEnableTrace;
101*1cddb830SAndroid Build Coastguard Worker 
102*1cddb830SAndroid Build Coastguard Worker #if defined(CL_ENABLE_LAYERS)
103*1cddb830SAndroid Build Coastguard Worker /*
104*1cddb830SAndroid Build Coastguard Worker  * KHRLayer
105*1cddb830SAndroid Build Coastguard Worker  *
106*1cddb830SAndroid Build Coastguard Worker  * Data for a single Layer
107*1cddb830SAndroid Build Coastguard Worker  */
108*1cddb830SAndroid Build Coastguard Worker struct KHRLayer;
109*1cddb830SAndroid Build Coastguard Worker struct KHRLayer
110*1cddb830SAndroid Build Coastguard Worker {
111*1cddb830SAndroid Build Coastguard Worker     // the loaded library object (true type varies on Linux versus Windows)
112*1cddb830SAndroid Build Coastguard Worker     void *library;
113*1cddb830SAndroid Build Coastguard Worker     // the dispatch table of the layer
114*1cddb830SAndroid Build Coastguard Worker     struct _cl_icd_dispatch dispatch;
115*1cddb830SAndroid Build Coastguard Worker     // The next layer in the chain
116*1cddb830SAndroid Build Coastguard Worker     struct KHRLayer *next;
117*1cddb830SAndroid Build Coastguard Worker #ifdef CL_LAYER_INFO
118*1cddb830SAndroid Build Coastguard Worker     // The layer library name
119*1cddb830SAndroid Build Coastguard Worker     char *libraryName;
120*1cddb830SAndroid Build Coastguard Worker     // the pointer to the clGetLayerInfo funciton
121*1cddb830SAndroid Build Coastguard Worker     void *p_clGetLayerInfo;
122*1cddb830SAndroid Build Coastguard Worker #endif
123*1cddb830SAndroid Build Coastguard Worker };
124*1cddb830SAndroid Build Coastguard Worker 
125*1cddb830SAndroid Build Coastguard Worker // the global layer state
126*1cddb830SAndroid Build Coastguard Worker extern struct KHRLayer * khrFirstLayer;
127*1cddb830SAndroid Build Coastguard Worker extern struct _cl_icd_dispatch khrMasterDispatch;
128*1cddb830SAndroid Build Coastguard Worker #endif // defined(CL_ENABLE_LAYERS)
129*1cddb830SAndroid Build Coastguard Worker 
130*1cddb830SAndroid Build Coastguard Worker /*
131*1cddb830SAndroid Build Coastguard Worker  * khrIcd interface
132*1cddb830SAndroid Build Coastguard Worker  */
133*1cddb830SAndroid Build Coastguard Worker 
134*1cddb830SAndroid Build Coastguard Worker // read vendors from system configuration and store the data
135*1cddb830SAndroid Build Coastguard Worker // loaded into khrIcdState.  this will call the OS-specific
136*1cddb830SAndroid Build Coastguard Worker // function khrIcdEnumerateVendors.  this is called at every
137*1cddb830SAndroid Build Coastguard Worker // dispatch function which may be a valid first call into the
138*1cddb830SAndroid Build Coastguard Worker // API (e.g, getPlatformIDs, etc).
139*1cddb830SAndroid Build Coastguard Worker void khrIcdInitialize(void);
140*1cddb830SAndroid Build Coastguard Worker 
141*1cddb830SAndroid Build Coastguard Worker // entrypoint to check and initialize trace.
142*1cddb830SAndroid Build Coastguard Worker void khrIcdInitializeTrace(void);
143*1cddb830SAndroid Build Coastguard Worker 
144*1cddb830SAndroid Build Coastguard Worker // go through the list of vendors (in /etc/OpenCL.conf or through
145*1cddb830SAndroid Build Coastguard Worker // the registry) and call khrIcdVendorAdd for each vendor encountered
146*1cddb830SAndroid Build Coastguard Worker // n.b, this call is OS-specific
147*1cddb830SAndroid Build Coastguard Worker void khrIcdOsVendorsEnumerateOnce(void);
148*1cddb830SAndroid Build Coastguard Worker 
149*1cddb830SAndroid Build Coastguard Worker // read vendors from environment variables
150*1cddb830SAndroid Build Coastguard Worker void khrIcdVendorsEnumerateEnv(void);
151*1cddb830SAndroid Build Coastguard Worker 
152*1cddb830SAndroid Build Coastguard Worker // add a vendor's implementation to the list of libraries
153*1cddb830SAndroid Build Coastguard Worker void khrIcdVendorAdd(const char *libraryName);
154*1cddb830SAndroid Build Coastguard Worker 
155*1cddb830SAndroid Build Coastguard Worker // read layers from environment variables
156*1cddb830SAndroid Build Coastguard Worker void khrIcdLayersEnumerateEnv(void);
157*1cddb830SAndroid Build Coastguard Worker 
158*1cddb830SAndroid Build Coastguard Worker // add a layer to the layer chain
159*1cddb830SAndroid Build Coastguard Worker void khrIcdLayerAdd(const char *libraryName);
160*1cddb830SAndroid Build Coastguard Worker 
161*1cddb830SAndroid Build Coastguard Worker // dynamically load a library.  returns NULL on failure
162*1cddb830SAndroid Build Coastguard Worker // n.b, this call is OS-specific
163*1cddb830SAndroid Build Coastguard Worker void *khrIcdOsLibraryLoad(const char *libraryName);
164*1cddb830SAndroid Build Coastguard Worker 
165*1cddb830SAndroid Build Coastguard Worker // get a function pointer from a loaded library.  returns NULL on failure.
166*1cddb830SAndroid Build Coastguard Worker // n.b, this call is OS-specific
167*1cddb830SAndroid Build Coastguard Worker void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName);
168*1cddb830SAndroid Build Coastguard Worker 
169*1cddb830SAndroid Build Coastguard Worker // unload a library.
170*1cddb830SAndroid Build Coastguard Worker // n.b, this call is OS-specific
171*1cddb830SAndroid Build Coastguard Worker void khrIcdOsLibraryUnload(void *library);
172*1cddb830SAndroid Build Coastguard Worker 
173*1cddb830SAndroid Build Coastguard Worker // parse properties and determine the platform to use from them
174*1cddb830SAndroid Build Coastguard Worker void khrIcdContextPropertiesGetPlatform(
175*1cddb830SAndroid Build Coastguard Worker     const cl_context_properties *properties,
176*1cddb830SAndroid Build Coastguard Worker     cl_platform_id *outPlatform);
177*1cddb830SAndroid Build Coastguard Worker 
178*1cddb830SAndroid Build Coastguard Worker // internal tracing macros
179*1cddb830SAndroid Build Coastguard Worker #define KHR_ICD_TRACE(...) \
180*1cddb830SAndroid Build Coastguard Worker do \
181*1cddb830SAndroid Build Coastguard Worker { \
182*1cddb830SAndroid Build Coastguard Worker     if (khrEnableTrace) \
183*1cddb830SAndroid Build Coastguard Worker     { \
184*1cddb830SAndroid Build Coastguard Worker         fprintf(stderr, "KHR ICD trace at %s:%d: ", __FILE__, __LINE__); \
185*1cddb830SAndroid Build Coastguard Worker         fprintf(stderr, __VA_ARGS__); \
186*1cddb830SAndroid Build Coastguard Worker     } \
187*1cddb830SAndroid Build Coastguard Worker } while (0)
188*1cddb830SAndroid Build Coastguard Worker 
189*1cddb830SAndroid Build Coastguard Worker #ifdef _WIN32
190*1cddb830SAndroid Build Coastguard Worker #define KHR_ICD_WIDE_TRACE(...) \
191*1cddb830SAndroid Build Coastguard Worker do \
192*1cddb830SAndroid Build Coastguard Worker { \
193*1cddb830SAndroid Build Coastguard Worker     if (khrEnableTrace) \
194*1cddb830SAndroid Build Coastguard Worker     { \
195*1cddb830SAndroid Build Coastguard Worker         fwprintf(stderr, L"KHR ICD trace at %hs:%d: ", __FILE__, __LINE__); \
196*1cddb830SAndroid Build Coastguard Worker         fwprintf(stderr, __VA_ARGS__); \
197*1cddb830SAndroid Build Coastguard Worker     } \
198*1cddb830SAndroid Build Coastguard Worker } while (0)
199*1cddb830SAndroid Build Coastguard Worker 
200*1cddb830SAndroid Build Coastguard Worker #else
201*1cddb830SAndroid Build Coastguard Worker #define KHR_ICD_WIDE_TRACE(...)
202*1cddb830SAndroid Build Coastguard Worker #endif
203*1cddb830SAndroid Build Coastguard Worker 
204*1cddb830SAndroid Build Coastguard Worker // Check if the passed-in handle is NULL, and if it is, return the error.
205*1cddb830SAndroid Build Coastguard Worker #define KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(_handle, _error)       \
206*1cddb830SAndroid Build Coastguard Worker do {                                                                \
207*1cddb830SAndroid Build Coastguard Worker     if (!_handle) {                                                 \
208*1cddb830SAndroid Build Coastguard Worker         return _error;                                              \
209*1cddb830SAndroid Build Coastguard Worker     }                                                               \
210*1cddb830SAndroid Build Coastguard Worker } while (0)
211*1cddb830SAndroid Build Coastguard Worker 
212*1cddb830SAndroid Build Coastguard Worker // Check if the passed-in handle is NULL, and if it is, first check and set
213*1cddb830SAndroid Build Coastguard Worker // errcode_ret to the error, then return NULL (NULL being an invalid handle).
214*1cddb830SAndroid Build Coastguard Worker #define KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(_handle, _error)      \
215*1cddb830SAndroid Build Coastguard Worker do {                                                                \
216*1cddb830SAndroid Build Coastguard Worker     if (!_handle) {                                                 \
217*1cddb830SAndroid Build Coastguard Worker         if (errcode_ret) {                                          \
218*1cddb830SAndroid Build Coastguard Worker             *errcode_ret = _error;                                  \
219*1cddb830SAndroid Build Coastguard Worker         }                                                           \
220*1cddb830SAndroid Build Coastguard Worker         return NULL;                                                \
221*1cddb830SAndroid Build Coastguard Worker     }                                                               \
222*1cddb830SAndroid Build Coastguard Worker } while (0)
223*1cddb830SAndroid Build Coastguard Worker 
224*1cddb830SAndroid Build Coastguard Worker // Check if the passed-in function pointer is NULL, and if it is, return
225*1cddb830SAndroid Build Coastguard Worker // CL_INVALID_OPERATION.
226*1cddb830SAndroid Build Coastguard Worker #define KHR_ICD_VALIDATE_POINTER_RETURN_ERROR(_pointer)             \
227*1cddb830SAndroid Build Coastguard Worker do {                                                                \
228*1cddb830SAndroid Build Coastguard Worker     if (!_pointer) {                                                \
229*1cddb830SAndroid Build Coastguard Worker         return CL_INVALID_OPERATION;                                \
230*1cddb830SAndroid Build Coastguard Worker     }                                                               \
231*1cddb830SAndroid Build Coastguard Worker } while (0)
232*1cddb830SAndroid Build Coastguard Worker 
233*1cddb830SAndroid Build Coastguard Worker // Check if the passed-in function pointer is NULL, and if it is, first
234*1cddb830SAndroid Build Coastguard Worker // check and set errcode_ret to CL_INVALID_OPERATION, then return NULL
235*1cddb830SAndroid Build Coastguard Worker // (NULL being an invalid handle).
236*1cddb830SAndroid Build Coastguard Worker #define KHR_ICD_VALIDATE_POINTER_RETURN_HANDLE(_pointer)            \
237*1cddb830SAndroid Build Coastguard Worker do {                                                                \
238*1cddb830SAndroid Build Coastguard Worker     if (!_pointer) {                                                \
239*1cddb830SAndroid Build Coastguard Worker         if (errcode_ret) {                                          \
240*1cddb830SAndroid Build Coastguard Worker             *errcode_ret = CL_INVALID_OPERATION;                    \
241*1cddb830SAndroid Build Coastguard Worker         }                                                           \
242*1cddb830SAndroid Build Coastguard Worker         return NULL;                                                \
243*1cddb830SAndroid Build Coastguard Worker     }                                                               \
244*1cddb830SAndroid Build Coastguard Worker } while (0)
245*1cddb830SAndroid Build Coastguard Worker 
246*1cddb830SAndroid Build Coastguard Worker #endif
247