1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <assert.h> 5 #include "icd_structs.h" 6 7 #define CL_USE_DEPRECATED_OPENCL_1_0_APIS 8 #define CL_USE_DEPRECATED_OPENCL_1_1_APIS 9 #define CL_USE_DEPRECATED_OPENCL_1_2_APIS 10 #define CL_USE_DEPRECATED_OPENCL_2_0_APIS 11 #define CL_USE_DEPRECATED_OPENCL_2_1_APIS 12 #define CL_USE_DEPRECATED_OPENCL_2_2_APIS 13 14 // Need to rename all CL API functions to prevent ICD loader functions calling 15 // themselves via the dispatch table. Include this before cl headers. 16 #include "rename_api.h" 17 18 #include "CL/cl.h" 19 #include "CL/cl_gl.h" 20 21 /* 22 * Prototypes for deprecated functions no longer present in cl.h 23 */ 24 extern CL_API_ENTRY cl_int CL_API_CALL 25 clSetCommandQueueProperty(cl_command_queue /* command_queue */, 26 cl_command_queue_properties /* properties */, 27 cl_bool /* enable */, 28 cl_command_queue_properties * /* old_properties */); 29 30 #define ICD_DISPATCH_TABLE_ENTRY(fn) \ 31 assert(dispatchTable->entryCount < 256); \ 32 dispatchTable->entries[dispatchTable->entryCount++] = (void*)(intptr_t)(fn) 33 cliIcdDispatchTableCreate(CLIicdDispatchTable ** outDispatchTable)34cl_int cliIcdDispatchTableCreate(CLIicdDispatchTable **outDispatchTable) 35 { 36 CLIicdDispatchTable *dispatchTable = NULL; 37 cl_int result = CL_SUCCESS; 38 39 // allocate the public handle 40 dispatchTable = (CLIicdDispatchTable *) malloc(sizeof(*dispatchTable)); 41 if (!dispatchTable) { 42 result = CL_OUT_OF_HOST_MEMORY; 43 goto Error; 44 } 45 memset(dispatchTable, 0, sizeof(*dispatchTable)); 46 47 // OpenCL 1.0 48 ICD_DISPATCH_TABLE_ENTRY ( clGetPlatformIDs ); 49 ICD_DISPATCH_TABLE_ENTRY ( clGetPlatformInfo ); 50 ICD_DISPATCH_TABLE_ENTRY ( clGetDeviceIDs ); 51 ICD_DISPATCH_TABLE_ENTRY ( clGetDeviceInfo ); 52 ICD_DISPATCH_TABLE_ENTRY ( clCreateContext ); 53 ICD_DISPATCH_TABLE_ENTRY ( clCreateContextFromType ); 54 ICD_DISPATCH_TABLE_ENTRY ( clRetainContext ); 55 ICD_DISPATCH_TABLE_ENTRY ( clReleaseContext ); 56 ICD_DISPATCH_TABLE_ENTRY ( clGetContextInfo ); 57 ICD_DISPATCH_TABLE_ENTRY ( clCreateCommandQueue ); 58 ICD_DISPATCH_TABLE_ENTRY ( clRetainCommandQueue ); 59 ICD_DISPATCH_TABLE_ENTRY ( clReleaseCommandQueue ); 60 ICD_DISPATCH_TABLE_ENTRY ( clGetCommandQueueInfo ); 61 ICD_DISPATCH_TABLE_ENTRY ( clSetCommandQueueProperty ); 62 ICD_DISPATCH_TABLE_ENTRY ( clCreateBuffer ); 63 ICD_DISPATCH_TABLE_ENTRY ( clCreateImage2D ); 64 ICD_DISPATCH_TABLE_ENTRY ( clCreateImage3D ); 65 ICD_DISPATCH_TABLE_ENTRY ( clRetainMemObject ); 66 ICD_DISPATCH_TABLE_ENTRY ( clReleaseMemObject ); 67 ICD_DISPATCH_TABLE_ENTRY ( clGetSupportedImageFormats ); 68 ICD_DISPATCH_TABLE_ENTRY ( clGetMemObjectInfo ); 69 ICD_DISPATCH_TABLE_ENTRY ( clGetImageInfo ); 70 ICD_DISPATCH_TABLE_ENTRY ( clCreateSampler ); 71 ICD_DISPATCH_TABLE_ENTRY ( clRetainSampler ); 72 ICD_DISPATCH_TABLE_ENTRY ( clReleaseSampler ); 73 ICD_DISPATCH_TABLE_ENTRY ( clGetSamplerInfo ); 74 ICD_DISPATCH_TABLE_ENTRY ( clCreateProgramWithSource ); 75 ICD_DISPATCH_TABLE_ENTRY ( clCreateProgramWithBinary ); 76 ICD_DISPATCH_TABLE_ENTRY ( clRetainProgram ); 77 ICD_DISPATCH_TABLE_ENTRY ( clReleaseProgram ); 78 ICD_DISPATCH_TABLE_ENTRY ( clBuildProgram ); 79 ICD_DISPATCH_TABLE_ENTRY ( clUnloadCompiler ); 80 ICD_DISPATCH_TABLE_ENTRY ( clGetProgramInfo ); 81 ICD_DISPATCH_TABLE_ENTRY ( clGetProgramBuildInfo ); 82 ICD_DISPATCH_TABLE_ENTRY ( clCreateKernel ); 83 ICD_DISPATCH_TABLE_ENTRY ( clCreateKernelsInProgram ); 84 ICD_DISPATCH_TABLE_ENTRY ( clRetainKernel ); 85 ICD_DISPATCH_TABLE_ENTRY ( clReleaseKernel ); 86 ICD_DISPATCH_TABLE_ENTRY ( clSetKernelArg ); 87 ICD_DISPATCH_TABLE_ENTRY ( clGetKernelInfo ); 88 ICD_DISPATCH_TABLE_ENTRY ( clGetKernelWorkGroupInfo ); 89 ICD_DISPATCH_TABLE_ENTRY ( clWaitForEvents ); 90 ICD_DISPATCH_TABLE_ENTRY ( clGetEventInfo ); 91 ICD_DISPATCH_TABLE_ENTRY ( clRetainEvent ); 92 ICD_DISPATCH_TABLE_ENTRY ( clReleaseEvent ); 93 ICD_DISPATCH_TABLE_ENTRY ( clGetEventProfilingInfo ); 94 ICD_DISPATCH_TABLE_ENTRY ( clFlush ); 95 ICD_DISPATCH_TABLE_ENTRY ( clFinish ); 96 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReadBuffer ); 97 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueWriteBuffer ); 98 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyBuffer ); 99 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReadImage ); 100 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueWriteImage ); 101 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyImage ); 102 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyImageToBuffer ); 103 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyBufferToImage ); 104 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMapBuffer ); 105 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMapImage ); 106 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueUnmapMemObject ); 107 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueNDRangeKernel ); 108 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueTask ); 109 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueNativeKernel ); 110 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMarker ); 111 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueWaitForEvents ); 112 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueBarrier ); 113 ICD_DISPATCH_TABLE_ENTRY ( clGetExtensionFunctionAddress ); 114 ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLBuffer ); 115 ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLTexture2D ); 116 ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLTexture3D ); 117 ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLRenderbuffer ); 118 ICD_DISPATCH_TABLE_ENTRY ( clGetGLObjectInfo ); 119 ICD_DISPATCH_TABLE_ENTRY ( clGetGLTextureInfo ); 120 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueAcquireGLObjects ); 121 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReleaseGLObjects ); 122 123 // cl_khr_gl_sharing 124 ICD_DISPATCH_TABLE_ENTRY ( clGetGLContextInfoKHR ); 125 126 // cl_khr_d3d10_sharing (windows-only) 127 #if 0 && defined(_WIN32) 128 ICD_DISPATCH_TABLE_ENTRY ( clGetDeviceIDsFromD3D10KHR ); 129 ICD_DISPATCH_TABLE_ENTRY ( clCreateFromD3D10BufferKHR ); 130 ICD_DISPATCH_TABLE_ENTRY ( clCreateFromD3D10Texture2DKHR ); 131 ICD_DISPATCH_TABLE_ENTRY ( clCreateFromD3D10Texture3DKHR ); 132 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueAcquireD3D10ObjectsKHR ); 133 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReleaseD3D10ObjectsKHR ); 134 #else 135 ICD_DISPATCH_TABLE_ENTRY( NULL ); 136 ICD_DISPATCH_TABLE_ENTRY( NULL ); 137 ICD_DISPATCH_TABLE_ENTRY( NULL ); 138 ICD_DISPATCH_TABLE_ENTRY( NULL ); 139 ICD_DISPATCH_TABLE_ENTRY( NULL ); 140 ICD_DISPATCH_TABLE_ENTRY( NULL ); 141 #endif 142 143 // OpenCL 1.1 144 ICD_DISPATCH_TABLE_ENTRY ( clSetEventCallback); 145 ICD_DISPATCH_TABLE_ENTRY ( clCreateSubBuffer); 146 ICD_DISPATCH_TABLE_ENTRY ( clSetMemObjectDestructorCallback); 147 ICD_DISPATCH_TABLE_ENTRY ( clCreateUserEvent); 148 ICD_DISPATCH_TABLE_ENTRY ( clSetUserEventStatus); 149 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueReadBufferRect); 150 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueWriteBufferRect); 151 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyBufferRect); 152 153 /* cl_ext_device_fission */ 154 ICD_DISPATCH_TABLE_ENTRY ( /*clCreateSubDevicesEXT*/NULL); 155 ICD_DISPATCH_TABLE_ENTRY ( /*clRetainDeviceEXT*/ NULL); 156 ICD_DISPATCH_TABLE_ENTRY ( /*clReleaseDevice*/NULL); 157 158 /* cl_khr_gl_event */ 159 ICD_DISPATCH_TABLE_ENTRY ( clCreateEventFromGLsyncKHR); 160 161 /* OpenCL 1.2 */ 162 ICD_DISPATCH_TABLE_ENTRY ( clCreateSubDevices); 163 ICD_DISPATCH_TABLE_ENTRY ( clRetainDevice); 164 ICD_DISPATCH_TABLE_ENTRY ( clReleaseDevice); 165 ICD_DISPATCH_TABLE_ENTRY ( clCreateImage); 166 ICD_DISPATCH_TABLE_ENTRY ( clCreateProgramWithBuiltInKernels); 167 ICD_DISPATCH_TABLE_ENTRY ( clCompileProgram); 168 ICD_DISPATCH_TABLE_ENTRY ( clLinkProgram); 169 ICD_DISPATCH_TABLE_ENTRY ( clUnloadPlatformCompiler); 170 ICD_DISPATCH_TABLE_ENTRY ( clGetKernelArgInfo); 171 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueFillBuffer); 172 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueFillImage); 173 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMigrateMemObjects); 174 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueMarkerWithWaitList); 175 ICD_DISPATCH_TABLE_ENTRY ( clEnqueueBarrierWithWaitList); 176 ICD_DISPATCH_TABLE_ENTRY ( clGetExtensionFunctionAddressForPlatform); 177 ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLTexture); 178 179 /* cl_khr_d3d11_sharing */ 180 ICD_DISPATCH_TABLE_ENTRY( NULL ); 181 ICD_DISPATCH_TABLE_ENTRY( NULL ); 182 ICD_DISPATCH_TABLE_ENTRY( NULL ); 183 ICD_DISPATCH_TABLE_ENTRY( NULL ); 184 ICD_DISPATCH_TABLE_ENTRY( NULL ); 185 ICD_DISPATCH_TABLE_ENTRY( NULL ); 186 ICD_DISPATCH_TABLE_ENTRY( NULL ); 187 188 /* cl_khr_dx9_media_sharing */ 189 ICD_DISPATCH_TABLE_ENTRY( NULL ); 190 ICD_DISPATCH_TABLE_ENTRY( NULL ); 191 ICD_DISPATCH_TABLE_ENTRY( NULL ); 192 193 /* cl_khr_egl_image */ 194 ICD_DISPATCH_TABLE_ENTRY( NULL ); 195 ICD_DISPATCH_TABLE_ENTRY( NULL ); 196 ICD_DISPATCH_TABLE_ENTRY( NULL ); 197 198 /* cl_khr_egl_event */ 199 ICD_DISPATCH_TABLE_ENTRY( NULL ); 200 201 /* OpenCL 2.0 */ 202 ICD_DISPATCH_TABLE_ENTRY( NULL ); 203 ICD_DISPATCH_TABLE_ENTRY( NULL ); 204 ICD_DISPATCH_TABLE_ENTRY( NULL ); 205 ICD_DISPATCH_TABLE_ENTRY( NULL ); 206 ICD_DISPATCH_TABLE_ENTRY( NULL ); 207 ICD_DISPATCH_TABLE_ENTRY( NULL ); 208 ICD_DISPATCH_TABLE_ENTRY( NULL ); 209 ICD_DISPATCH_TABLE_ENTRY( NULL ); 210 ICD_DISPATCH_TABLE_ENTRY( NULL ); 211 ICD_DISPATCH_TABLE_ENTRY( NULL ); 212 ICD_DISPATCH_TABLE_ENTRY( NULL ); 213 ICD_DISPATCH_TABLE_ENTRY( NULL ); 214 ICD_DISPATCH_TABLE_ENTRY( NULL ); 215 216 /* cl_khr_sub_groups */ 217 ICD_DISPATCH_TABLE_ENTRY( NULL ); 218 219 /* OpenCL 2.1 */ 220 ICD_DISPATCH_TABLE_ENTRY( NULL ); 221 ICD_DISPATCH_TABLE_ENTRY( NULL ); 222 ICD_DISPATCH_TABLE_ENTRY( NULL ); 223 ICD_DISPATCH_TABLE_ENTRY( NULL ); 224 ICD_DISPATCH_TABLE_ENTRY( NULL ); 225 ICD_DISPATCH_TABLE_ENTRY( NULL ); 226 ICD_DISPATCH_TABLE_ENTRY( NULL ); 227 228 /* OpenCL 2.2 */ 229 ICD_DISPATCH_TABLE_ENTRY( NULL ); 230 ICD_DISPATCH_TABLE_ENTRY( NULL ); 231 232 /* OpenCL 3.0 */ 233 ICD_DISPATCH_TABLE_ENTRY ( clCreateBufferWithProperties ); 234 ICD_DISPATCH_TABLE_ENTRY ( clCreateImageWithProperties ); 235 ICD_DISPATCH_TABLE_ENTRY ( clSetContextDestructorCallback ); 236 237 // return success 238 *outDispatchTable = dispatchTable; 239 return CL_SUCCESS; 240 241 Error: 242 return result; 243 } 244 245 void cliIcdDispatchTableDestroy(CLIicdDispatchTable * dispatchTable)246cliIcdDispatchTableDestroy(CLIicdDispatchTable *dispatchTable) 247 { 248 free(dispatchTable); 249 } 250