18 #ifndef _MAGICKCORE_OPENCL_PRIVATE_H
19 #define _MAGICKCORE_OPENCL_PRIVATE_H
27 #if defined(__cplusplus) || defined(c_plusplus)
31 #if !defined(MAGICKCORE_OPENCL_SUPPORT)
42 #define MAX_COMMAND_QUEUES 8
51 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformIDs)(
53 cl_platform_id * platforms,
54 cl_uint * num_platforms) CL_API_SUFFIX__VERSION_1_0;
56 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformInfo)(
57 cl_platform_id platform,
58 cl_platform_info param_name,
59 size_t param_value_size,
61 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
64 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceIDs)(
65 cl_platform_id platform,
68 cl_device_id * devices,
69 cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0;
71 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceInfo)(
73 cl_device_info param_name,
74 size_t param_value_size,
76 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
79 typedef CL_API_ENTRY
cl_context (CL_API_CALL *MAGICKpfn_clCreateContext)(
80 const cl_context_properties * properties,
82 const cl_device_id * devices,
83 void (CL_CALLBACK *pfn_notify)(
const char *,
const void *, size_t,
void *),
85 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
87 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseContext)(
88 cl_context context) CL_API_SUFFIX__VERSION_1_0;
91 typedef CL_API_ENTRY
cl_command_queue (CL_API_CALL *MAGICKpfn_clCreateCommandQueue)(
94 cl_command_queue_properties properties,
95 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
97 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
98 cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
101 typedef CL_API_ENTRY
cl_mem (CL_API_CALL *MAGICKpfn_clCreateBuffer)(
106 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
108 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0;
111 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithSource)(
114 const char ** strings,
115 const size_t * lengths,
116 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
118 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithBinary)(
121 const cl_device_id * device_list,
122 const size_t * lengths,
123 const unsigned char ** binaries,
124 cl_int * binary_status,
125 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
127 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
129 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clBuildProgram)(
132 const cl_device_id * device_list,
133 const char * options,
134 void (CL_CALLBACK *pfn_notify)(cl_program program,
void * user_data),
135 void * user_data) CL_API_SUFFIX__VERSION_1_0;
137 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramInfo)(
139 cl_program_info param_name,
140 size_t param_value_size,
142 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
144 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramBuildInfo)(
147 cl_program_build_info param_name,
148 size_t param_value_size,
150 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
153 typedef CL_API_ENTRY
cl_kernel (CL_API_CALL *MAGICKpfn_clCreateKernel)(
155 const char * kernel_name,
156 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
158 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0;
160 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clSetKernelArg)(
164 const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
167 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
169 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFinish)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
172 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueReadBuffer)(
173 cl_command_queue command_queue,
175 cl_bool blocking_read,
179 cl_uint num_events_in_wait_list,
180 const cl_event * event_wait_list,
181 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
183 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueWriteBuffer)(
184 cl_command_queue command_queue,
186 cl_bool blocking_write,
190 cl_uint num_events_in_wait_list,
191 const cl_event * event_wait_list,
192 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
194 typedef CL_API_ENTRY
void * (CL_API_CALL *MAGICKpfn_clEnqueueMapBuffer)(
195 cl_command_queue command_queue,
197 cl_bool blocking_map,
198 cl_map_flags map_flags,
201 cl_uint num_events_in_wait_list,
202 const cl_event * event_wait_list,
204 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
206 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueUnmapMemObject)(
207 cl_command_queue command_queue,
210 cl_uint num_events_in_wait_list,
211 const cl_event * event_wait_list,
212 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
214 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueNDRangeKernel)(
215 cl_command_queue command_queue,
218 const size_t * global_work_offset,
219 const size_t * global_work_size,
220 const size_t * local_work_size,
221 cl_uint num_events_in_wait_list,
222 const cl_event * event_wait_list,
223 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
225 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clGetEventProfilingInfo)(
227 cl_profiling_info param_name,
228 size_t param_value_size,
230 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
232 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clWaitForEvents)(
234 const cl_event *event_list) CL_API_SUFFIX__VERSION_1_0;
236 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clReleaseEvent)(
237 cl_event event) CL_API_SUFFIX__VERSION_1_0;
248 typedef struct MagickLibraryRec MagickLibrary;
250 struct MagickLibraryRec
254 MAGICKpfn_clGetPlatformIDs clGetPlatformIDs;
255 MAGICKpfn_clGetPlatformInfo clGetPlatformInfo;
256 MAGICKpfn_clGetDeviceIDs clGetDeviceIDs;
257 MAGICKpfn_clGetDeviceInfo clGetDeviceInfo;
258 MAGICKpfn_clCreateContext clCreateContext;
259 MAGICKpfn_clCreateCommandQueue clCreateCommandQueue;
260 MAGICKpfn_clReleaseCommandQueue clReleaseCommandQueue;
261 MAGICKpfn_clCreateBuffer clCreateBuffer;
262 MAGICKpfn_clReleaseMemObject clReleaseMemObject;
263 MAGICKpfn_clCreateProgramWithSource clCreateProgramWithSource;
264 MAGICKpfn_clCreateProgramWithBinary clCreateProgramWithBinary;
265 MAGICKpfn_clReleaseProgram clReleaseProgram;
266 MAGICKpfn_clBuildProgram clBuildProgram;
267 MAGICKpfn_clGetProgramInfo clGetProgramInfo;
268 MAGICKpfn_clGetProgramBuildInfo clGetProgramBuildInfo;
269 MAGICKpfn_clCreateKernel clCreateKernel;
270 MAGICKpfn_clReleaseKernel clReleaseKernel;
271 MAGICKpfn_clSetKernelArg clSetKernelArg;
272 MAGICKpfn_clFlush clFlush;
273 MAGICKpfn_clFinish clFinish;
274 MAGICKpfn_clEnqueueReadBuffer clEnqueueReadBuffer;
275 MAGICKpfn_clEnqueueWriteBuffer clEnqueueWriteBuffer;
276 MAGICKpfn_clEnqueueMapBuffer clEnqueueMapBuffer;
277 MAGICKpfn_clEnqueueUnmapMemObject clEnqueueUnmapMemObject;
278 MAGICKpfn_clEnqueueNDRangeKernel clEnqueueNDRangeKernel;
279 MAGICKpfn_clGetEventProfilingInfo clGetEventProfilingInfo;
280 MAGICKpfn_clWaitForEvents clWaitForEvents;
281 MAGICKpfn_clReleaseEvent clReleaseEvent;
288 MagickLibrary * library;
291 cl_platform_id platform;
302 unsigned int numGenerators;
309 cl_command_queue commandQueues[MAX_COMMAND_QUEUES];
310 ssize_t commandQueuesPos;
316 #if defined(MAGICKCORE_HDRI_SUPPORT)
317 #define CLOptions "-cl-single-precision-constant -cl-mad-enable -DMAGICKCORE_HDRI_SUPPORT=1 "\
318 "-DCLQuantum=float -DCLSignedQuantum=float -DCLPixelType=float4 -DQuantumRange=%f " \
319 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
320 " -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
321 #define CLPixelPacket cl_float4
322 #define CLCharQuantumScale 1.0f
323 #elif (MAGICKCORE_QUANTUM_DEPTH == 8)
324 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
325 "-DCLQuantum=uchar -DCLSignedQuantum=char -DCLPixelType=uchar4 -DQuantumRange=%ff " \
326 "-DQuantumScale=%ff -DCharQuantumScale=%ff -DMagickEpsilon=%ff -DMagickPI=%ff "\
327 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
328 #define CLPixelPacket cl_uchar4
329 #define CLCharQuantumScale 1.0f
330 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
331 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
332 "-DCLQuantum=ushort -DCLSignedQuantum=short -DCLPixelType=ushort4 -DQuantumRange=%f "\
333 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
334 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
335 #define CLPixelPacket cl_ushort4
336 #define CLCharQuantumScale 257.0f
337 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
338 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
339 "-DCLQuantum=uint -DCLSignedQuantum=int -DCLPixelType=uint4 -DQuantumRange=%f "\
340 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
341 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
342 #define CLPixelPacket cl_uint4
343 #define CLCharQuantumScale 16843009.0f
344 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
345 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
346 "-DCLQuantum=ulong -DCLSignedQuantum=long -DCLPixelType=ulong4 -DQuantumRange=%f "\
347 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
348 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
349 #define CLPixelPacket cl_ulong4
350 #define CLCharQuantumScale 72340172838076673.0f
391 const char *,
const char *,
const size_t,
422 const unsigned int line,
424 #ifdef OPENCLLOG_ENABLED
440 #if defined(__cplusplus) || defined(c_plusplus)
Definition: opencl-private.h:367
MagickPrivate cl_command_queue AcquireOpenCLCommandQueue(MagickCLEnv)
void * cl_event
Definition: opencl-private.h:35
Definition: exception.h:102
Definition: opencl-private.h:366
Definition: opencl-private.h:377
MagickBooleanType OpenCLInitialized
Definition: opencl.c:2830
MagickPrivate MagickBooleanType RelinquishOpenCLCommandQueue(MagickCLEnv, cl_command_queue)
void * cl_command_queue
Definition: opencl-private.h:33
MagickPrivate unsigned long GetOpenCLDeviceMaxMemAllocSize(MagickCLEnv)
MagickExport ssize_t FormatLocaleString(char *magick_restrict string, const size_t length, const char *magick_restrict format,...)
Definition: locale.c:471
Definition: opencl-private.h:361
Definition: opencl-private.h:356
void * cl_device_id
Definition: opencl-private.h:34
MagickPrivate unsigned long GetOpenCLDeviceLocalMemorySize(MagickCLEnv)
Definition: opencl-private.h:369
ExceptionType
Definition: exception.h:28
Definition: opencl-private.h:372
void * cl_platform_id
Definition: opencl-private.h:38
MagickPrivate void OpenCLTerminus()
Definition: opencl-private.h:365
MagickBooleanType
Definition: magick-type.h:211
Definition: opencl-private.h:374
void * cl_kernel
Definition: opencl-private.h:36
char * reason
Definition: exception.h:111
Definition: opencl-private.h:355
MagickPrivate const char * GetOpenCLCachedFilesDirectory()
Definition: opencl.c:3003
void * cl_context
Definition: opencl-private.h:32
#define MaxTextExtent
Definition: method-attribute.h:106
Definition: opencl-private.h:357
Definition: opencl-private.h:376
MagickOpenCLProgram
Definition: opencl.h:27
MagickPrivate void RecordProfileData(MagickCLEnv, ProfiledKernels, cl_event)
MagickPrivate cl_kernel AcquireOpenCLKernel(MagickCLEnv, MagickOpenCLProgram, const char *)
MagickPrivate void OpenCLLog(const char *)
MagickPrivate MagickBooleanType OpenCLThrowMagickException(ExceptionInfo *, const char *, const char *, const size_t, const ExceptionType, const char *, const char *,...)
Definition: opencl-private.h:362
MagickPrivate cl_context GetOpenCLContext(MagickCLEnv)
MagickPrivate void UnlockRandSeedBuffer(MagickCLEnv)
Definition: opencl.c:2980
Definition: opencl-private.h:358
Definition: opencl-private.h:373
void * cl_mem
Definition: opencl-private.h:37
Definition: opencl-private.h:39
Definition: opencl-private.h:370
Definition: opencl-private.h:360
MagickPrivate float GetRandNormalize(MagickCLEnv)
Definition: opencl.c:2991
#define magick_unreferenced(x)
Definition: method-attribute.h:123
MagickPrivate unsigned int GetNumRandGenerators(MagickCLEnv)
Definition: opencl.c:2985
ProfiledKernels
Definition: opencl-private.h:353
Definition: opencl-private.h:354
#define MagickPrivate
Definition: method-attribute.h:99
Definition: opencl-private.h:368
static void OpenCLLogException(const char *function, const unsigned int line, ExceptionInfo *exception)
Definition: opencl-private.h:421
Definition: opencl-private.h:364
Definition: opencl-private.h:363
Definition: opencl-private.h:371
MagickPrivate cl_mem GetAndLockRandSeedBuffer(MagickCLEnv)
Definition: opencl.c:2973
Definition: semaphore.c:58
Definition: opencl-private.h:375
Definition: opencl-private.h:359
Definition: opencl.c:2829
MagickPrivate MagickBooleanType RelinquishOpenCLKernel(MagickCLEnv, cl_kernel)
ExceptionType severity
Definition: exception.h:105