1 // icd.h (Oclgrind) 2 // Copyright (c) 2013-2019, James Price and Simon McIntosh-Smith, 3 // University of Bristol. All rights reserved. 4 // 5 // This program is provided under a three-clause BSD license. For full 6 // license terms please see the LICENSE file distributed with this 7 // source code. 8 9 #ifndef _ICD_H_ 10 #define _ICD_H_ 11 12 // Rename OpenCL API functions to avoid clashes with ICD library 13 #ifdef OCLGRIND_ICD 14 #define clGetPlatformIDs _clGetPlatformIDs 15 #define clGetPlatformInfo _clGetPlatformInfo 16 #define clGetDeviceIDs _clGetDeviceIDs 17 #define clGetDeviceInfo _clGetDeviceInfo 18 #define clCreateSubDevices _clCreateSubDevices 19 #define clRetainDevice _clRetainDevice 20 #define clReleaseDevice _clReleaseDevice 21 #define clCreateContext _clCreateContext 22 #define clCreateContextFromType _clCreateContextFromType 23 #define clRetainContext _clRetainContext 24 #define clReleaseContext _clReleaseContext 25 #define clGetContextInfo _clGetContextInfo 26 #define clCreateCommandQueue _clCreateCommandQueue 27 #define clSetCommandQueueProperty _clSetCommandQueueProperty 28 #define clRetainCommandQueue _clRetainCommandQueue 29 #define clReleaseCommandQueue _clReleaseCommandQueue 30 #define clGetCommandQueueInfo _clGetCommandQueueInfo 31 #define clCreateBuffer _clCreateBuffer 32 #define clCreateSubBuffer _clCreateSubBuffer 33 #define clCreateImage _clCreateImage 34 #define clCreateImage2D _clCreateImage2D 35 #define clCreateImage3D _clCreateImage3D 36 #define clRetainMemObject _clRetainMemObject 37 #define clReleaseMemObject _clReleaseMemObject 38 #define clGetSupportedImageFormats _clGetSupportedImageFormats 39 #define clGetMemObjectInfo _clGetMemObjectInfo 40 #define clGetImageInfo _clGetImageInfo 41 #define clSetMemObjectDestructorCallback _clSetMemObjectDestructorCallback 42 #define clCreateSampler _clCreateSampler 43 #define clRetainSampler _clRetainSampler 44 #define clReleaseSampler _clReleaseSampler 45 #define clGetSamplerInfo _clGetSamplerInfo 46 #define clCreateProgramWithSource _clCreateProgramWithSource 47 #define clCreateProgramWithBinary _clCreateProgramWithBinary 48 #define clCreateProgramWithBuiltInKernels _clCreateProgramWithBuiltInKernels 49 #define clRetainProgram _clRetainProgram 50 #define clReleaseProgram _clReleaseProgram 51 #define clBuildProgram _clBuildProgram 52 #define clUnloadCompiler _clUnloadCompiler 53 #define clCompileProgram _clCompileProgram 54 #define clLinkProgram _clLinkProgram 55 #define clUnloadPlatformCompiler _clUnloadPlatformCompiler 56 #define clGetProgramInfo _clGetProgramInfo 57 #define clGetProgramBuildInfo _clGetProgramBuildInfo 58 #define clCreateKernel _clCreateKernel 59 #define clCreateKernelsInProgram _clCreateKernelsInProgram 60 #define clRetainKernel _clRetainKernel 61 #define clReleaseKernel _clReleaseKernel 62 #define clSetKernelArg _clSetKernelArg 63 #define clGetKernelInfo _clGetKernelInfo 64 #define clGetKernelArgInfo _clGetKernelArgInfo 65 #define clGetKernelWorkGroupInfo _clGetKernelWorkGroupInfo 66 #define clWaitForEvents _clWaitForEvents 67 #define clGetEventInfo _clGetEventInfo 68 #define clCreateUserEvent _clCreateUserEvent 69 #define clRetainEvent _clRetainEvent 70 #define clReleaseEvent _clReleaseEvent 71 #define clSetUserEventStatus _clSetUserEventStatus 72 #define clSetEventCallback _clSetEventCallback 73 #define clGetEventProfilingInfo _clGetEventProfilingInfo 74 #define clFlush _clFlush 75 #define clFinish _clFinish 76 #define clEnqueueReadBuffer _clEnqueueReadBuffer 77 #define clEnqueueReadBufferRect _clEnqueueReadBufferRect 78 #define clEnqueueWriteBuffer _clEnqueueWriteBuffer 79 #define clEnqueueWriteBufferRect _clEnqueueWriteBufferRect 80 #define clEnqueueCopyBuffer _clEnqueueCopyBuffer 81 #define clEnqueueCopyBufferRect _clEnqueueCopyBufferRect 82 #define clEnqueueFillBuffer _clEnqueueFillBuffer 83 #define clEnqueueFillImage _clEnqueueFillImage 84 #define clEnqueueReadImage _clEnqueueReadImage 85 #define clEnqueueWriteImage _clEnqueueWriteImage 86 #define clEnqueueCopyImage _clEnqueueCopyImage 87 #define clEnqueueCopyImageToBuffer _clEnqueueCopyImageToBuffer 88 #define clEnqueueCopyBufferToImage _clEnqueueCopyBufferToImage 89 #define clEnqueueMapBuffer _clEnqueueMapBuffer 90 #define clEnqueueMapImage _clEnqueueMapImage 91 #define clEnqueueUnmapMemObject _clEnqueueUnmapMemObject 92 #define clEnqueueMigrateMemObjects _clEnqueueMigrateMemObjects 93 #define clEnqueueNDRangeKernel _clEnqueueNDRangeKernel 94 #define clEnqueueTask _clEnqueueTask 95 #define clEnqueueNativeKernel _clEnqueueNativeKernel 96 #define clGetExtensionFunctionAddressForPlatform \ 97 _clGetExtensionFunctionAddressForPlatform 98 #define clEnqueueMarkerWithWaitList _clEnqueueMarkerWithWaitList 99 #define clEnqueueBarrierWithWaitList _clEnqueueBarrierWithWaitList 100 #define clSetPrintfCallback _clSetPrintfCallback 101 #define clEnqueueMarker _clEnqueueMarker 102 #define clEnqueueWaitForEvents _clEnqueueWaitForEvents 103 #define clEnqueueBarrier _clEnqueueBarrier 104 #define clCreateFromGLBuffer _clCreateFromGLBuffer 105 #define clCreateFromGLTexture _clCreateFromGLTexture 106 #define clCreateFromGLTexture2D _clCreateFromGLTexture2D 107 #define clCreateFromGLTexture3D _clCreateFromGLTexture3D 108 #define clCreateFromGLRenderbuffer _clCreateFromGLRenderbuffer 109 #define clGetGLObjectInfo _clGetGLObjectInfo 110 #define clGetGLTextureInfo _clGetGLTextureInfo 111 #define clEnqueueAcquireGLObjects _clEnqueueAcquireGLObjects 112 #define clEnqueueReleaseGLObjects _clEnqueueReleaseGLObjects 113 #define clGetGLContextInfoKHR _clGetGLContextInfoKHR 114 #define clCreateEventFromGLsyncKHR _clCreateEventFromGLsyncKHR 115 #endif // OCLGRIND_ICD 116 117 #include <cstdint> 118 #include <list> 119 #include <map> 120 #include <stack> 121 #include <vector> 122 123 #define CL_USE_DEPRECATED_OPENCL_1_0_APIS 124 #define CL_USE_DEPRECATED_OPENCL_1_1_APIS 125 #define CL_USE_DEPRECATED_OPENCL_1_2_APIS 126 #define CL_USE_DEPRECATED_OPENCL_2_0_APIS 127 #define CL_USE_DEPRECATED_OPENCL_2_1_APIS 128 #define CL_USE_DEPRECATED_OPENCL_2_2_APIS 129 #define CL_TARGET_OPENCL_VERSION 300 130 #include "CL/cl.h" 131 #include "CL/cl_ext.h" 132 #include "CL/cl_gl.h" 133 #include "CL/cl_gl_ext.h" 134 #if defined(_WIN32) && !defined(__MINGW32__) 135 // clang-format off 136 #include "CL/cl_d3d11.h" 137 #include "CL/cl_d3d10.h" 138 #include "CL/cl_dx9_media_sharing.h" 139 // clang-format on 140 #endif 141 142 namespace oclgrind 143 { 144 class Context; 145 class Kernel; 146 class Program; 147 class Queue; 148 struct Command; 149 struct Event; 150 struct Image; 151 } // namespace oclgrind 152 153 struct _cl_platform_id 154 { 155 void* dispatch; 156 }; 157 158 struct _cl_device_id 159 { 160 void** dispatch; 161 size_t globalMemSize; 162 size_t constantMemSize; 163 size_t localMemSize; 164 size_t maxWGSize; 165 }; 166 167 struct _cl_context 168 { 169 void* dispatch; 170 oclgrind::Context* context; 171 void(CL_CALLBACK* notify)(const char*, const void*, size_t, void*); 172 void* data; 173 cl_context_properties* properties; 174 size_t szProperties; 175 std::stack<std::pair<void(CL_CALLBACK*)(cl_context, void*), void*>> callbacks; 176 unsigned int refCount; 177 }; 178 179 struct _cl_command_queue 180 { 181 void* dispatch; 182 cl_command_queue_properties properties; 183 cl_context context; 184 std::vector<cl_queue_properties> properties_array; 185 oclgrind::Queue* queue; 186 unsigned int refCount; 187 }; 188 189 struct _cl_mem 190 { 191 void* dispatch; 192 cl_context context; 193 cl_mem parent; 194 size_t address; 195 size_t size; 196 size_t offset; 197 cl_mem_flags flags; 198 bool isImage; 199 void* hostPtr; 200 std::stack<std::pair<void(CL_CALLBACK*)(cl_mem, void*), void*>> callbacks; 201 std::vector<cl_mem_properties> properties; 202 unsigned int refCount; 203 }; 204 205 struct cl_image : _cl_mem 206 { 207 cl_image_format format; 208 cl_image_desc desc; 209 }; 210 211 struct _cl_program 212 { 213 void* dispatch; 214 oclgrind::Program* program; 215 cl_context context; 216 unsigned int refCount; 217 }; 218 219 struct _cl_kernel 220 { 221 void* dispatch; 222 oclgrind::Kernel* kernel; 223 cl_program program; 224 std::map<cl_uint, cl_mem> memArgs; 225 std::vector<oclgrind::Image*> imageArgs; 226 unsigned int refCount; 227 }; 228 229 struct _cl_event 230 { 231 void* dispatch; 232 cl_context context; 233 cl_command_queue queue; 234 cl_command_type type; 235 oclgrind::Event* event; 236 std::list<std::pair<void(CL_CALLBACK*)(cl_event, cl_int, void*), void*>> 237 callbacks; 238 unsigned int refCount; 239 }; 240 241 struct _cl_sampler 242 { 243 void* dispatch; 244 cl_context context; 245 cl_bool normCoords; 246 cl_addressing_mode addressMode; 247 cl_filter_mode filterMode; 248 std::vector<cl_sampler_properties> properties; 249 uint32_t sampler; 250 unsigned int refCount; 251 }; 252 253 extern void* m_dispatchTable[256]; 254 255 #endif // _ICD_H_ 256