blob: 67adf1e281e977114b574c7ffe75248697713810 [file] [log] [blame]
cristydbba8212013-07-19 14:53:50 +00001/*
cristyb56bb242014-11-25 17:12:48 +00002Copyright 1999-2015 ImageMagick Studio LLC, a non-profit organization
cristy0c832c62014-03-07 22:21:04 +00003dedicated to making software imaging solutions freely available.
cristydbba8212013-07-19 14:53:50 +00004
cristy0c832c62014-03-07 22:21:04 +00005You may not use this file except in compliance with the License.
6obtain a copy of the License at
cristyf034abb2013-11-24 14:16:14 +00007
cristy0c832c62014-03-07 22:21:04 +00008http://www.imagemagick.org/script/license.php
cristyf034abb2013-11-24 14:16:14 +00009
cristy0c832c62014-03-07 22:21:04 +000010Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
cristyf034abb2013-11-24 14:16:14 +000015
cristy0c832c62014-03-07 22:21:04 +000016MagickCore OpenCL private methods.
cristydbba8212013-07-19 14:53:50 +000017*/
18#ifndef _MAGICKCORE_OPENCL_PRIVATE_H
19#define _MAGICKCORE_OPENCL_PRIVATE_H
20
cristy0c832c62014-03-07 22:21:04 +000021/*
22Include declarations.
23*/
cristyf034abb2013-11-24 14:16:14 +000024#include "MagickCore/studio.h"
cristye85d0f72013-11-27 02:25:43 +000025#include "MagickCore/opencl.h"
cristyf034abb2013-11-24 14:16:14 +000026
cristydbba8212013-07-19 14:53:50 +000027#if defined(__cplusplus) || defined(c_plusplus)
28extern "C" {
29#endif
30
cristy58450242013-12-15 17:16:03 +000031#if !defined(MAGICKCORE_OPENCL_SUPPORT)
cristyf034abb2013-11-24 14:16:14 +000032 typedef void* cl_platform_id;
33 typedef void* cl_device_id;
34 typedef void* cl_context;
35 typedef void* cl_command_queue;
36 typedef void* cl_kernel;
cristy0c832c62014-03-07 22:21:04 +000037 typedef void* cl_mem;
cristyf034abb2013-11-24 14:16:14 +000038 typedef struct { unsigned char t[8]; } cl_device_type; /* 64-bit */
cristy0c832c62014-03-07 22:21:04 +000039#else
40/*
41 *
42 * function pointer typedefs
43 *
44 */
45
46/* Platform APIs */
47typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformIDs)(
48 cl_uint num_entries,
49 cl_platform_id * platforms,
50 cl_uint * num_platforms) CL_API_SUFFIX__VERSION_1_0;
51
52typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformInfo)(
53 cl_platform_id platform,
54 cl_platform_info param_name,
55 size_t param_value_size,
56 void * param_value,
57 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
58
59/* Device APIs */
60typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceIDs)(
61 cl_platform_id platform,
62 cl_device_type device_type,
63 cl_uint num_entries,
64 cl_device_id * devices,
65 cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0;
66
67typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceInfo)(
68 cl_device_id device,
69 cl_device_info param_name,
70 size_t param_value_size,
71 void * param_value,
72 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
73
74/* Context APIs */
75typedef CL_API_ENTRY cl_context (CL_API_CALL *MAGICKpfn_clCreateContext)(
76 const cl_context_properties * properties,
77 cl_uint num_devices,
78 const cl_device_id * devices,
79 void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *),
80 void * user_data,
81 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
82
83typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseContext)(
84 cl_context context) CL_API_SUFFIX__VERSION_1_0;
85
86/* Command Queue APIs */
87typedef CL_API_ENTRY cl_command_queue (CL_API_CALL *MAGICKpfn_clCreateCommandQueue)(
88 cl_context context,
89 cl_device_id device,
90 cl_command_queue_properties properties,
91 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
92
93typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
94 cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
95
96/* Memory Object APIs */
97typedef CL_API_ENTRY cl_mem (CL_API_CALL *MAGICKpfn_clCreateBuffer)(
98 cl_context context,
99 cl_mem_flags flags,
100 size_t size,
101 void * host_ptr,
102 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
103
104typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0;
105
106/* Program Object APIs */
107typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithSource)(
108 cl_context context,
109 cl_uint count,
110 const char ** strings,
111 const size_t * lengths,
112 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
113
114typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithBinary)(
115 cl_context context,
116 cl_uint num_devices,
117 const cl_device_id * device_list,
118 const size_t * lengths,
119 const unsigned char ** binaries,
120 cl_int * binary_status,
121 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
122
123typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
124
125typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clBuildProgram)(
126 cl_program program,
127 cl_uint num_devices,
128 const cl_device_id * device_list,
129 const char * options,
130 void (CL_CALLBACK *pfn_notify)(cl_program program, void * user_data),
131 void * user_data) CL_API_SUFFIX__VERSION_1_0;
132
133typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramInfo)(
134 cl_program program,
135 cl_program_info param_name,
136 size_t param_value_size,
137 void * param_value,
138 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
139
140typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramBuildInfo)(
141 cl_program program,
142 cl_device_id device,
143 cl_program_build_info param_name,
144 size_t param_value_size,
145 void * param_value,
146 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
147
148/* Kernel Object APIs */
149typedef CL_API_ENTRY cl_kernel (CL_API_CALL *MAGICKpfn_clCreateKernel)(
150 cl_program program,
151 const char * kernel_name,
152 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
153
154typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0;
155
156typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clSetKernelArg)(
157 cl_kernel kernel,
158 cl_uint arg_index,
159 size_t arg_size,
160 const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
161
162/* Flush and Finish APIs */
163typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
164
165typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFinish)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
166
167/* Enqueued Commands APIs */
168typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueReadBuffer)(
169 cl_command_queue command_queue,
170 cl_mem buffer,
171 cl_bool blocking_read,
172 size_t offset,
173 size_t cb,
174 void * ptr,
175 cl_uint num_events_in_wait_list,
176 const cl_event * event_wait_list,
177 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
178
179typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueWriteBuffer)(
180 cl_command_queue command_queue,
181 cl_mem buffer,
182 cl_bool blocking_write,
183 size_t offset,
184 size_t cb,
185 const void * ptr,
186 cl_uint num_events_in_wait_list,
187 const cl_event * event_wait_list,
188 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
189
190typedef CL_API_ENTRY void * (CL_API_CALL *MAGICKpfn_clEnqueueMapBuffer)(
191 cl_command_queue command_queue,
192 cl_mem buffer,
193 cl_bool blocking_map,
194 cl_map_flags map_flags,
195 size_t offset,
196 size_t cb,
197 cl_uint num_events_in_wait_list,
198 const cl_event * event_wait_list,
199 cl_event * event,
200 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
201
202typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueUnmapMemObject)(
203 cl_command_queue command_queue,
204 cl_mem memobj,
205 void * mapped_ptr,
206 cl_uint num_events_in_wait_list,
207 const cl_event * event_wait_list,
208 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
209
210typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueNDRangeKernel)(
211 cl_command_queue command_queue,
212 cl_kernel kernel,
213 cl_uint work_dim,
214 const size_t * global_work_offset,
215 const size_t * global_work_size,
216 const size_t * local_work_size,
217 cl_uint num_events_in_wait_list,
218 const cl_event * event_wait_list,
219 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
220
221/*
222 *
223 * vendor dispatch table structure
224 *
225 * note that the types in the structure KHRicdVendorDispatch mirror the function
226 * names listed in the string table khrIcdVendorDispatchFunctionNames
227 *
228 */
229
230typedef struct MagickLibraryRec MagickLibrary;
231
232struct MagickLibraryRec
233{
234 void * base;
235
236 MAGICKpfn_clGetPlatformIDs clGetPlatformIDs;
237 MAGICKpfn_clGetPlatformInfo clGetPlatformInfo;
238 MAGICKpfn_clGetDeviceIDs clGetDeviceIDs;
239 MAGICKpfn_clGetDeviceInfo clGetDeviceInfo;
240 MAGICKpfn_clCreateContext clCreateContext;
241 MAGICKpfn_clCreateCommandQueue clCreateCommandQueue;
242 MAGICKpfn_clReleaseCommandQueue clReleaseCommandQueue;
243 MAGICKpfn_clCreateBuffer clCreateBuffer;
244 MAGICKpfn_clReleaseMemObject clReleaseMemObject;
245 MAGICKpfn_clCreateProgramWithSource clCreateProgramWithSource;
246 MAGICKpfn_clCreateProgramWithBinary clCreateProgramWithBinary;
247 MAGICKpfn_clReleaseProgram clReleaseProgram;
248 MAGICKpfn_clBuildProgram clBuildProgram;
249 MAGICKpfn_clGetProgramInfo clGetProgramInfo;
250 MAGICKpfn_clGetProgramBuildInfo clGetProgramBuildInfo;
251 MAGICKpfn_clCreateKernel clCreateKernel;
252 MAGICKpfn_clReleaseKernel clReleaseKernel;
253 MAGICKpfn_clSetKernelArg clSetKernelArg;
254 MAGICKpfn_clFlush clFlush;
255 MAGICKpfn_clFinish clFinish;
256 MAGICKpfn_clEnqueueReadBuffer clEnqueueReadBuffer;
257 MAGICKpfn_clEnqueueWriteBuffer clEnqueueWriteBuffer;
258 MAGICKpfn_clEnqueueMapBuffer clEnqueueMapBuffer;
259 MAGICKpfn_clEnqueueUnmapMemObject clEnqueueUnmapMemObject;
260 MAGICKpfn_clEnqueueNDRangeKernel clEnqueueNDRangeKernel;
261};
262
263struct _MagickCLEnv {
264 MagickBooleanType OpenCLInitialized; /* whether OpenCL environment is initialized. */
265 MagickBooleanType OpenCLDisabled; /* whether if OpenCL has been explicitely disabled. */
266
267 MagickLibrary * library;
268
269 /*OpenCL objects */
270 cl_platform_id platform;
271 cl_device_type deviceType;
272 cl_device_id device;
273 cl_context context;
274
275 MagickBooleanType disableProgramCache; /* disable the OpenCL program cache */
276 cl_program programs[MAGICK_OPENCL_NUM_PROGRAMS]; /* one program object maps one kernel source file */
277
278 MagickBooleanType regenerateProfile; /* re-run the microbenchmark in auto device selection mode */
279
280 /* Random number generator seeds */
281 unsigned int numGenerators;
282 float randNormalize;
283 cl_mem seeds;
284 SemaphoreInfo* seedsLock;
285
286 SemaphoreInfo* lock;
287};
288
cristyf034abb2013-11-24 14:16:14 +0000289#endif
290
291#if defined(MAGICKCORE_HDRI_SUPPORT)
292#define CLOptions "-cl-single-precision-constant -cl-mad-enable -DMAGICKCORE_HDRI_SUPPORT=1 "\
293 "-DCLQuantum=float -DCLSignedQuantum=float -DCLPixelType=float4 -DQuantumRange=%f " \
294 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
295 " -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
296#define CLPixelPacket cl_float4
297#define CLCharQuantumScale 1.0f
298#elif (MAGICKCORE_QUANTUM_DEPTH == 8)
299#define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
cristy0c832c62014-03-07 22:21:04 +0000300 "-DCLQuantum=uchar -DCLSignedQuantum=char -DCLPixelType=uchar4 -DQuantumRange=%ff " \
301 "-DQuantumScale=%ff -DCharQuantumScale=%ff -DMagickEpsilon=%ff -DMagickPI=%ff "\
cristyf034abb2013-11-24 14:16:14 +0000302 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
303#define CLPixelPacket cl_uchar4
304#define CLCharQuantumScale 1.0f
305#elif (MAGICKCORE_QUANTUM_DEPTH == 16)
306#define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
307 "-DCLQuantum=ushort -DCLSignedQuantum=short -DCLPixelType=ushort4 -DQuantumRange=%f "\
308 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
309 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
310#define CLPixelPacket cl_ushort4
311#define CLCharQuantumScale 257.0f
312#elif (MAGICKCORE_QUANTUM_DEPTH == 32)
313#define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
314 "-DCLQuantum=uint -DCLSignedQuantum=int -DCLPixelType=uint4 -DQuantumRange=%f "\
315 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
316 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
317#define CLPixelPacket cl_uint4
318#define CLCharQuantumScale 16843009.0f
319#elif (MAGICKCORE_QUANTUM_DEPTH == 64)
320#define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
321 "-DCLQuantum=ulong -DCLSignedQuantum=long -DCLPixelType=ulong4 -DQuantumRange=%f "\
322 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
323 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
324#define CLPixelPacket cl_ulong4
325#define CLCharQuantumScale 72340172838076673.0f
326#endif
327
cristy7b6514c2013-12-10 23:13:13 +0000328extern MagickPrivate cl_context
cristyf034abb2013-11-24 14:16:14 +0000329 GetOpenCLContext(MagickCLEnv);
330
cristy7b6514c2013-12-10 23:13:13 +0000331extern MagickPrivate cl_kernel
cristyf034abb2013-11-24 14:16:14 +0000332 AcquireOpenCLKernel(MagickCLEnv, MagickOpenCLProgram, const char*);
333
cristy7b6514c2013-12-10 23:13:13 +0000334extern MagickPrivate cl_command_queue
cristyf034abb2013-11-24 14:16:14 +0000335 AcquireOpenCLCommandQueue(MagickCLEnv);
336
cristy7b6514c2013-12-10 23:13:13 +0000337extern MagickPrivate MagickBooleanType
cristy0c832c62014-03-07 22:21:04 +0000338 OpenCLThrowMagickException(ExceptionInfo *,
339 const char *,const char *,const size_t,
340 const ExceptionType,const char *,const char *,...),
cristyf034abb2013-11-24 14:16:14 +0000341 RelinquishOpenCLCommandQueue(MagickCLEnv, cl_command_queue),
342 RelinquishOpenCLKernel(MagickCLEnv, cl_kernel);
343
cristy7b6514c2013-12-10 23:13:13 +0000344extern MagickPrivate unsigned long
cristyf034abb2013-11-24 14:16:14 +0000345 GetOpenCLDeviceLocalMemorySize(MagickCLEnv),
346 GetOpenCLDeviceMaxMemAllocSize(MagickCLEnv);
347
cristy7b6514c2013-12-10 23:13:13 +0000348extern MagickPrivate const char*
cristyf034abb2013-11-24 14:16:14 +0000349 GetOpenCLCachedFilesDirectory();
350
cristy0c832c62014-03-07 22:21:04 +0000351extern MagickPrivate void
352 UnlockRandSeedBuffer(MagickCLEnv),
cristyf034abb2013-11-24 14:16:14 +0000353 OpenCLLog(const char*);
354
cristy0c832c62014-03-07 22:21:04 +0000355extern MagickPrivate cl_mem
356 GetAndLockRandSeedBuffer(MagickCLEnv);
357
358extern MagickPrivate unsigned int
359 GetNumRandGenerators(MagickCLEnv);
360
361extern MagickPrivate float
362 GetRandNormalize(MagickCLEnv clEnv);
363
364typedef struct _AccelerateTimer {
365 long long _freq;
366 long long _clocks;
367 long long _start;
368} AccelerateTimer;
369
370
371void startAccelerateTimer(AccelerateTimer* timer);
372void stopAccelerateTimer(AccelerateTimer* timer);
373void resetAccelerateTimer(AccelerateTimer* timer);
374void initAccelerateTimer(AccelerateTimer* timer);
375double readAccelerateTimer(AccelerateTimer* timer);
376
cristye85d0f72013-11-27 02:25:43 +0000377/* #define OPENCLLOG_ENABLED 1 */
cristyf034abb2013-11-24 14:16:14 +0000378static inline void OpenCLLogException(const char* function,
379 const unsigned int line,
380 ExceptionInfo* exception) {
cristye85d0f72013-11-27 02:25:43 +0000381#ifdef OPENCLLOG_ENABLED
cristyf034abb2013-11-24 14:16:14 +0000382 if (exception->severity!=0) {
cristy151b66d2015-04-15 10:50:31 +0000383 char message[MagickPathExtent];
cristyf034abb2013-11-24 14:16:14 +0000384 /* dump the source into a file */
cristy151b66d2015-04-15 10:50:31 +0000385 (void) FormatLocaleString(message,MagickPathExtent,"%s:%d Exception(%d):%s "
cristy0c832c62014-03-07 22:21:04 +0000386 ,function,line,exception->severity,exception->reason);
cristyf034abb2013-11-24 14:16:14 +0000387 OpenCLLog(message);
cristy711ed182013-11-24 15:15:16 +0000388 }
cristye85d0f72013-11-27 02:25:43 +0000389#else
390 magick_unreferenced(function);
391 magick_unreferenced(line);
392 magick_unreferenced(exception);
393#endif
cristyf034abb2013-11-24 14:16:14 +0000394}
395
cristy0c832c62014-03-07 22:21:04 +0000396
cristydbba8212013-07-19 14:53:50 +0000397#if defined(__cplusplus) || defined(c_plusplus)
398}
399#endif
400
401#endif