1<% 2# APIs to skip - they need to be done "manually": 3apiskip = { 4 'clGetPlatformIDs', # to query platforms 5 'clGetExtensionFunctionAddress', # to return ICD-aware extensions 6 'clGetExtensionFunctionAddressForPlatform', # to return ICD-aware extensions 7 } 8 9apiinit = { 10 'clCreateContextFromType', 11 'clGetGLContextInfoKHR', 12 } 13# Handles, and mappings to errors when handles are invalid: 14apihandles = { 15 'cl_command_queue' : 'CL_INVALID_COMMAND_QUEUE', 16 'cl_context' : 'CL_INVALID_CONTEXT', 17 'cl_device_id' : 'CL_INVALID_DEVICE', 18 'cl_event' : 'CL_INVALID_EVENT', 19 'cl_kernel' : 'CL_INVALID_KERNEL', 20 'cl_mem' : 'CL_INVALID_MEM_OBJECT', 21 'cl_platform_id' : 'CL_INVALID_PLATFORM', 22 'cl_program' : 'CL_INVALID_PROGRAM', 23 'cl_sampler' : 'CL_INVALID_SAMPLER', 24 } 25%>/* 26 * Copyright (c) 2012-2023 The Khronos Group Inc. 27 * 28 * Licensed under the Apache License, Version 2.0 (the "License"); 29 * you may not use this file except in compliance with the License. 30 * You may obtain a copy of the License at 31 * 32 * http://www.apache.org/licenses/LICENSE-2.0 33 * 34 * Unless required by applicable law or agreed to in writing, software 35 * distributed under the License is distributed on an "AS IS" BASIS, 36 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 37 * See the License for the specific language governing permissions and 38 * limitations under the License. 39 * 40 * OpenCL is a trademark of Apple Inc. used under license by Khronos. 41 */ 42 43#include "icd.h" 44#include "icd_dispatch.h" 45 46#ifdef __cplusplus 47extern "C" { 48#endif 49 50/////////////////////////////////////////////////////////////////////////////// 51// Core APIs: 52%for apis in coreapis.values(): 53%for api in apis: 54%if not api.Name in apiskip: 55<% 56 handle = api.Params[0] 57 if handle.Type in apihandles: 58 invalid = apihandles[handle.Type] 59 else: 60 invalid = 'NULL' 61%> 62%for disp in [0, 1]: 63% if disp == 1: 64#if defined(CL_ENABLE_LAYERS) 65% endif 66${("CL_API_ENTRY", "static")[disp]} ${api.RetType} CL_API_CALL ${api.Name + ("", "_disp")[disp]}( 67%for i, param in enumerate(api.Params): 68% if i < len(api.Params)-1: 69 ${param.Type} ${param.Name}${param.TypeEnd}, 70% else: 71 ${param.Type} ${param.Name}${param.TypeEnd}) 72% endif 73%endfor 74{ 75%if api.Name in apiinit: 76 khrIcdInitialize(); 77%endif 78%if disp == 0: 79#if defined(CL_ENABLE_LAYERS) 80 if (khrFirstLayer) 81% if api.Name == "clSVMFree": 82 { 83 khrFirstLayer->dispatch.${api.Name}( 84% else: 85 return khrFirstLayer->dispatch.${api.Name}( 86% endif 87%for i, param in enumerate(api.Params): 88% if i < len(api.Params)-1: 89 ${param.Name}, 90% else: 91 ${param.Name}); 92% endif 93%endfor 94% if api.Name == "clSVMFree": 95 } 96 else 97% endif 98#endif // defined(CL_ENABLE_LAYERS) 99%endif 100%if api.RetType in apihandles or api.RetType == "void*": 101## clCreateContext is a special case, since it calls through 102## the dispatch table via the first "device": 103% if api.Name == "clCreateContext": 104 if (${api.Params[1].Name} == 0 || ${api.Params[2].Name} == NULL) { 105 KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(NULL, CL_INVALID_VALUE); 106 } 107 KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(${api.Params[2].Name}[0], CL_INVALID_DEVICE); 108## clCreateContextFromType is a special case, since it calls 109## through a platform passed via properties: 110% elif api.Name == "clCreateContextFromType": 111 cl_platform_id platform = NULL; 112 khrIcdContextPropertiesGetPlatform(properties, &platform); 113 KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(platform, CL_INVALID_PLATFORM); 114## These APIs are special cases because they return a void*, but 115## do not nave an errcode_ret: 116% elif api.Name == "clSVMAlloc" or api.Name == "clGetExtensionFunctionAddressForPlatform": 117 KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${handle.Name}, NULL); 118% else: 119 KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(${handle.Name}, ${invalid}); 120% endif 121%elif api.Name == "clSVMFree": 122## clSVMFree has no return value or errcode_ret: 123 if (${handle.Name} != NULL) 124## clWaitForEvents is a special case, since it calls through 125## the dispatch table via the first "event": 126%elif api.Name == "clWaitForEvents": 127 if (${api.Params[0].Name} == 0 || ${api.Params[1].Name} == NULL) { 128 return CL_INVALID_VALUE; 129 } 130 KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${api.Params[1].Name}[0], CL_INVALID_EVENT); 131%elif api.Name == "clUnloadCompiler": 132 // Nothing! 133%else: 134 KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${handle.Name}, ${invalid}); 135%endif 136%if api.Name == "clCreateContext": 137 return ${api.Params[2].Name}[0]->dispatch->${api.Name}( 138%elif api.Name == "clWaitForEvents": 139 return ${api.Params[1].Name}[0]->dispatch->${api.Name}( 140%elif api.Name == "clCreateContextFromType": 141 return platform->dispatch->${api.Name}( 142%elif api.Name == "clSVMFree": 143 ${handle.Name}->dispatch->${api.Name}( 144%elif api.Name == "clUnloadCompiler": 145 return CL_SUCCESS; 146%else: 147 return ${handle.Name}->dispatch->${api.Name}( 148%endif: 149%for i, param in enumerate(api.Params): 150% if i < len(api.Params)-1: 151 ${param.Name}, 152% elif param.Name: # for clUnloadCompiler 153 ${param.Name}); 154% endif 155%endfor 156} 157% if disp == 1: 158#endif // defined(CL_ENABLE_LAYERS) 159% endif 160 161/////////////////////////////////////////////////////////////////////////////// 162%endfor 163%else: 164#if defined(CL_ENABLE_LAYERS) 165extern ${api.RetType} CL_API_CALL ${api.Name + "_disp"}( 166%for i, param in enumerate(api.Params): 167% if i < len(api.Params)-1: 168 ${param.Type} ${param.Name}${param.TypeEnd}, 169% else: 170 ${param.Type} ${param.Name}${param.TypeEnd}) ${api.Suffix}; 171% endif 172%endfor 173#endif // defined(CL_ENABLE_LAYERS) 174%endif 175%endfor 176%endfor 177<% 178icdextensions = [ 179 'cl_ext_device_fission', 180 'cl_khr_d3d10_sharing', 181 'cl_khr_d3d11_sharing', 182 'cl_khr_dx9_media_sharing', 183 'cl_khr_egl_event', 184 'cl_khr_egl_image', 185 'cl_khr_gl_event', 186 'cl_khr_gl_sharing', 187 'cl_khr_subgroups' 188 ] 189win32extensions = { 190 'cl_khr_d3d10_sharing', 191 'cl_khr_d3d11_sharing', 192 'cl_khr_dx9_media_sharing', 193 } 194%> 195%for extension in icdextensions: 196<% 197 apis = extapis[extension] 198%>// ${extension} 199%if extension in win32extensions: 200 201#if defined(_WIN32) 202%endif 203%for api in apis: 204<% 205 handle = api.Params[0] 206 if handle.Type in apihandles: 207 invalid = apihandles[handle.Type] 208 else: 209 invalid = 'NULL' 210%> 211%for disp in [0, 1]: 212% if disp == 1: 213#if defined(CL_ENABLE_LAYERS) 214% endif 215${("CL_API_ENTRY", "static")[disp]} ${api.RetType} CL_API_CALL ${api.Name + ("", "_disp")[disp]}( 216%for i, param in enumerate(api.Params): 217% if i < len(api.Params)-1: 218 ${param.Type} ${param.Name}${param.TypeEnd}, 219% else: 220 ${param.Type} ${param.Name}${param.TypeEnd}) 221% endif 222%endfor 223{ 224%if disp == 0: 225#if defined(CL_ENABLE_LAYERS) 226 if (khrFirstLayer) 227 return khrFirstLayer->dispatch.${api.Name}( 228%for i, param in enumerate(api.Params): 229% if i < len(api.Params)-1: 230 ${param.Name}, 231% else: 232 ${param.Name}); 233% endif 234%endfor 235#endif // defined(CL_ENABLE_LAYERS) 236%endif 237%if api.RetType in apihandles or api.RetType == "void*": 238% if False: 239 // api.Name == "clXXX": # There are currently no API special cases here. 240% else: 241 KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(${handle.Name}, ${invalid}); 242 KHR_ICD_VALIDATE_POINTER_RETURN_HANDLE(${handle.Name}->dispatch->${api.Name}); 243% endif 244%else: 245% if api.Name == "clGetGLContextInfoKHR": 246 cl_platform_id platform = NULL; 247 khrIcdContextPropertiesGetPlatform(properties, &platform); 248 KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM); 249 KHR_ICD_VALIDATE_POINTER_RETURN_ERROR(platform->dispatch->${api.Name}); 250% else: 251 KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${handle.Name}, ${invalid}); 252 KHR_ICD_VALIDATE_POINTER_RETURN_ERROR(${handle.Name}->dispatch->${api.Name}); 253% endif 254%endif 255%if api.Name == "clGetGLContextInfoKHR": 256 return platform->dispatch->${api.Name}( 257%else: 258 return ${handle.Name}->dispatch->${api.Name}( 259%endif 260%for i, param in enumerate(api.Params): 261% if i < len(api.Params)-1: 262 ${param.Name}, 263% elif param.Name: # for clUnloadCompiler 264 ${param.Name}); 265% endif 266%endfor 267} 268% if disp == 1: 269#endif // defined(CL_ENABLE_LAYERS) 270% endif 271%endfor 272%endfor 273 274%if extension in win32extensions: 275#endif // defined(_WIN32) 276 277%endif 278/////////////////////////////////////////////////////////////////////////////// 279 280%endfor 281#if defined(CL_ENABLE_LAYERS) 282struct _cl_icd_dispatch khrMasterDispatch = { 283 &clGetPlatformIDs_disp, 284 &clGetPlatformInfo_disp, 285 &clGetDeviceIDs_disp, 286 &clGetDeviceInfo_disp, 287 &clCreateContext_disp, 288 &clCreateContextFromType_disp, 289 &clRetainContext_disp, 290 &clReleaseContext_disp, 291 &clGetContextInfo_disp, 292 &clCreateCommandQueue_disp, 293 &clRetainCommandQueue_disp, 294 &clReleaseCommandQueue_disp, 295 &clGetCommandQueueInfo_disp, 296 &clSetCommandQueueProperty_disp, 297 &clCreateBuffer_disp, 298 &clCreateImage2D_disp, 299 &clCreateImage3D_disp, 300 &clRetainMemObject_disp, 301 &clReleaseMemObject_disp, 302 &clGetSupportedImageFormats_disp, 303 &clGetMemObjectInfo_disp, 304 &clGetImageInfo_disp, 305 &clCreateSampler_disp, 306 &clRetainSampler_disp, 307 &clReleaseSampler_disp, 308 &clGetSamplerInfo_disp, 309 &clCreateProgramWithSource_disp, 310 &clCreateProgramWithBinary_disp, 311 &clRetainProgram_disp, 312 &clReleaseProgram_disp, 313 &clBuildProgram_disp, 314 &clUnloadCompiler_disp, 315 &clGetProgramInfo_disp, 316 &clGetProgramBuildInfo_disp, 317 &clCreateKernel_disp, 318 &clCreateKernelsInProgram_disp, 319 &clRetainKernel_disp, 320 &clReleaseKernel_disp, 321 &clSetKernelArg_disp, 322 &clGetKernelInfo_disp, 323 &clGetKernelWorkGroupInfo_disp, 324 &clWaitForEvents_disp, 325 &clGetEventInfo_disp, 326 &clRetainEvent_disp, 327 &clReleaseEvent_disp, 328 &clGetEventProfilingInfo_disp, 329 &clFlush_disp, 330 &clFinish_disp, 331 &clEnqueueReadBuffer_disp, 332 &clEnqueueWriteBuffer_disp, 333 &clEnqueueCopyBuffer_disp, 334 &clEnqueueReadImage_disp, 335 &clEnqueueWriteImage_disp, 336 &clEnqueueCopyImage_disp, 337 &clEnqueueCopyImageToBuffer_disp, 338 &clEnqueueCopyBufferToImage_disp, 339 &clEnqueueMapBuffer_disp, 340 &clEnqueueMapImage_disp, 341 &clEnqueueUnmapMemObject_disp, 342 &clEnqueueNDRangeKernel_disp, 343 &clEnqueueTask_disp, 344 &clEnqueueNativeKernel_disp, 345 &clEnqueueMarker_disp, 346 &clEnqueueWaitForEvents_disp, 347 &clEnqueueBarrier_disp, 348 &clGetExtensionFunctionAddress_disp, 349 &clCreateFromGLBuffer_disp, 350 &clCreateFromGLTexture2D_disp, 351 &clCreateFromGLTexture3D_disp, 352 &clCreateFromGLRenderbuffer_disp, 353 &clGetGLObjectInfo_disp, 354 &clGetGLTextureInfo_disp, 355 &clEnqueueAcquireGLObjects_disp, 356 &clEnqueueReleaseGLObjects_disp, 357 &clGetGLContextInfoKHR_disp, 358 359 /* cl_khr_d3d10_sharing */ 360#if defined(_WIN32) 361 &clGetDeviceIDsFromD3D10KHR_disp, 362 &clCreateFromD3D10BufferKHR_disp, 363 &clCreateFromD3D10Texture2DKHR_disp, 364 &clCreateFromD3D10Texture3DKHR_disp, 365 &clEnqueueAcquireD3D10ObjectsKHR_disp, 366 &clEnqueueReleaseD3D10ObjectsKHR_disp, 367#else 368 NULL, 369 NULL, 370 NULL, 371 NULL, 372 NULL, 373 NULL, 374#endif 375 376 /* OpenCL 1.1 */ 377 &clSetEventCallback_disp, 378 &clCreateSubBuffer_disp, 379 &clSetMemObjectDestructorCallback_disp, 380 &clCreateUserEvent_disp, 381 &clSetUserEventStatus_disp, 382 &clEnqueueReadBufferRect_disp, 383 &clEnqueueWriteBufferRect_disp, 384 &clEnqueueCopyBufferRect_disp, 385 386 /* cl_ext_device_fission */ 387 &clCreateSubDevicesEXT_disp, 388 &clRetainDeviceEXT_disp, 389 &clReleaseDeviceEXT_disp, 390 391 /* cl_khr_gl_event */ 392 &clCreateEventFromGLsyncKHR_disp, 393 394 /* OpenCL 1.2 */ 395 &clCreateSubDevices_disp, 396 &clRetainDevice_disp, 397 &clReleaseDevice_disp, 398 &clCreateImage_disp, 399 &clCreateProgramWithBuiltInKernels_disp, 400 &clCompileProgram_disp, 401 &clLinkProgram_disp, 402 &clUnloadPlatformCompiler_disp, 403 &clGetKernelArgInfo_disp, 404 &clEnqueueFillBuffer_disp, 405 &clEnqueueFillImage_disp, 406 &clEnqueueMigrateMemObjects_disp, 407 &clEnqueueMarkerWithWaitList_disp, 408 &clEnqueueBarrierWithWaitList_disp, 409 &clGetExtensionFunctionAddressForPlatform_disp, 410 &clCreateFromGLTexture_disp, 411 412 /* cl_khr_d3d11_sharing */ 413#if defined(_WIN32) 414 &clGetDeviceIDsFromD3D11KHR_disp, 415 &clCreateFromD3D11BufferKHR_disp, 416 &clCreateFromD3D11Texture2DKHR_disp, 417 &clCreateFromD3D11Texture3DKHR_disp, 418 &clCreateFromDX9MediaSurfaceKHR_disp, 419 &clEnqueueAcquireD3D11ObjectsKHR_disp, 420 &clEnqueueReleaseD3D11ObjectsKHR_disp, 421#else 422 NULL, 423 NULL, 424 NULL, 425 NULL, 426 NULL, 427 NULL, 428 NULL, 429#endif 430 431 /* cl_khr_dx9_media_sharing */ 432#if defined(_WIN32) 433 &clGetDeviceIDsFromDX9MediaAdapterKHR_disp, 434 &clEnqueueAcquireDX9MediaSurfacesKHR_disp, 435 &clEnqueueReleaseDX9MediaSurfacesKHR_disp, 436#else 437 NULL, 438 NULL, 439 NULL, 440#endif 441 442 /* cl_khr_egl_image */ 443 &clCreateFromEGLImageKHR_disp, 444 &clEnqueueAcquireEGLObjectsKHR_disp, 445 &clEnqueueReleaseEGLObjectsKHR_disp, 446 447 /* cl_khr_egl_event */ 448 &clCreateEventFromEGLSyncKHR_disp, 449 450 /* OpenCL 2.0 */ 451 &clCreateCommandQueueWithProperties_disp, 452 &clCreatePipe_disp, 453 &clGetPipeInfo_disp, 454 &clSVMAlloc_disp, 455 &clSVMFree_disp, 456 &clEnqueueSVMFree_disp, 457 &clEnqueueSVMMemcpy_disp, 458 &clEnqueueSVMMemFill_disp, 459 &clEnqueueSVMMap_disp, 460 &clEnqueueSVMUnmap_disp, 461 &clCreateSamplerWithProperties_disp, 462 &clSetKernelArgSVMPointer_disp, 463 &clSetKernelExecInfo_disp, 464 465 /* cl_khr_sub_groups */ 466 &clGetKernelSubGroupInfoKHR_disp, 467 468 /* OpenCL 2.1 */ 469 &clCloneKernel_disp, 470 &clCreateProgramWithIL_disp, 471 &clEnqueueSVMMigrateMem_disp, 472 &clGetDeviceAndHostTimer_disp, 473 &clGetHostTimer_disp, 474 &clGetKernelSubGroupInfo_disp, 475 &clSetDefaultDeviceCommandQueue_disp, 476 477 /* OpenCL 2.2 */ 478 &clSetProgramReleaseCallback_disp, 479 &clSetProgramSpecializationConstant_disp, 480 481 /* OpenCL 3.0 */ 482 &clCreateBufferWithProperties_disp, 483 &clCreateImageWithProperties_disp, 484 &clSetContextDestructorCallback_disp 485}; 486#endif // defined(CL_ENABLE_LAYERS) 487#ifdef __cplusplus 488} 489#endif 490