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