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