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)
37#define MAX_COMMAND_QUEUES 16
46typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformIDs)(
48 cl_platform_id * platforms,
49 cl_uint * num_platforms) CL_API_SUFFIX__VERSION_1_0;
51typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformInfo)(
52 cl_platform_id platform,
53 cl_platform_info param_name,
54 size_t param_value_size,
56 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
59typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceIDs)(
60 cl_platform_id platform,
61 cl_device_type device_type,
63 cl_device_id * devices,
64 cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0;
66typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceInfo)(
68 cl_device_info param_name,
69 size_t param_value_size,
71 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
74typedef CL_API_ENTRY cl_context (CL_API_CALL *MAGICKpfn_clCreateContext)(
75 const cl_context_properties * properties,
77 const cl_device_id * devices,
78 void (CL_CALLBACK *pfn_notify)(
const char *,
const void *, size_t,
void *),
80 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
82typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseContext)(
83 cl_context context) CL_API_SUFFIX__VERSION_1_0;
86typedef CL_API_ENTRY cl_command_queue (CL_API_CALL *MAGICKpfn_clCreateCommandQueue)(
89 cl_command_queue_properties properties,
90 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
92typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
93 cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
96typedef CL_API_ENTRY
cl_mem (CL_API_CALL *MAGICKpfn_clCreateBuffer)(
101 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
103typedef CL_API_ENTRY cl_int
104 (CL_API_CALL *MAGICKpfn_clRetainMemObject)(
cl_mem memobj)
105 CL_API_SUFFIX__VERSION_1_0;
107typedef CL_API_ENTRY cl_int
108 (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(
cl_mem memobj)
109 CL_API_SUFFIX__VERSION_1_0;
112typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithSource)(
115 const char ** strings,
116 const size_t * lengths,
117 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
119typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithBinary)(
122 const cl_device_id * device_list,
123 const size_t * lengths,
124 const unsigned char ** binaries,
125 cl_int * binary_status,
126 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
128typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
130typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clBuildProgram)(
133 const cl_device_id * device_list,
134 const char * options,
135 void (CL_CALLBACK *pfn_notify)(cl_program program,
void * user_data),
136 void * user_data) CL_API_SUFFIX__VERSION_1_0;
138typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramInfo)(
140 cl_program_info param_name,
141 size_t param_value_size,
143 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
145typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramBuildInfo)(
148 cl_program_build_info param_name,
149 size_t param_value_size,
151 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
154typedef CL_API_ENTRY cl_kernel (CL_API_CALL *MAGICKpfn_clCreateKernel)(
156 const char * kernel_name,
157 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
159typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0;
161typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clSetKernelArg)(
165 const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
167typedef CL_API_ENTRY cl_int
168 (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue)
169 CL_API_SUFFIX__VERSION_1_0;
171typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFinish)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
174typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueReadBuffer)(
175 cl_command_queue command_queue,
177 cl_bool blocking_read,
181 cl_uint num_events_in_wait_list,
183 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
185typedef CL_API_ENTRY
void * (CL_API_CALL *MAGICKpfn_clEnqueueMapBuffer)(
186 cl_command_queue command_queue,
188 cl_bool blocking_map,
189 cl_map_flags map_flags,
192 cl_uint num_events_in_wait_list,
195 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
197typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueUnmapMemObject)(
198 cl_command_queue command_queue,
201 cl_uint num_events_in_wait_list,
203 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
205typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueNDRangeKernel)(
206 cl_command_queue command_queue,
209 const size_t * global_work_offset,
210 const size_t * global_work_size,
211 const size_t * local_work_size,
212 cl_uint num_events_in_wait_list,
214 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
216typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clGetEventProfilingInfo)(
218 cl_profiling_info param_name,
219 size_t param_value_size,
221 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
223typedef CL_API_ENTRY cl_int
224 (CL_API_CALL *MAGICKpfn_clGetEventInfo)(
cl_event event,
225 cl_profiling_info param_name,
size_t param_value_size,
void *param_value,
226 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
228typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clWaitForEvents)(
230 const cl_event *event_list) CL_API_SUFFIX__VERSION_1_0;
232typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clReleaseEvent)(
233 cl_event event) CL_API_SUFFIX__VERSION_1_0;
235typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clRetainEvent)(
236 cl_event event) CL_API_SUFFIX__VERSION_1_0;
238typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clSetEventCallback)(
239 cl_event event,cl_int command_exec_callback_type,
240 void (CL_CALLBACK *MAGICKpfn_notify)(
cl_event,cl_int,
void *),
241 void *user_data) CL_API_SUFFIX__VERSION_1_1;
252typedef struct MagickLibraryRec MagickLibrary;
254struct MagickLibraryRec
258 MAGICKpfn_clGetPlatformIDs clGetPlatformIDs;
259 MAGICKpfn_clGetPlatformInfo clGetPlatformInfo;
261 MAGICKpfn_clGetDeviceIDs clGetDeviceIDs;
262 MAGICKpfn_clGetDeviceInfo clGetDeviceInfo;
264 MAGICKpfn_clCreateContext clCreateContext;
265 MAGICKpfn_clReleaseContext clReleaseContext;
267 MAGICKpfn_clCreateCommandQueue clCreateCommandQueue;
268 MAGICKpfn_clReleaseCommandQueue clReleaseCommandQueue;
269 MAGICKpfn_clFlush clFlush;
270 MAGICKpfn_clFinish clFinish;
272 MAGICKpfn_clCreateBuffer clCreateBuffer;
273 MAGICKpfn_clRetainMemObject clRetainMemObject;
274 MAGICKpfn_clReleaseMemObject clReleaseMemObject;
275 MAGICKpfn_clCreateProgramWithSource clCreateProgramWithSource;
276 MAGICKpfn_clCreateProgramWithBinary clCreateProgramWithBinary;
277 MAGICKpfn_clReleaseProgram clReleaseProgram;
278 MAGICKpfn_clBuildProgram clBuildProgram;
279 MAGICKpfn_clGetProgramInfo clGetProgramInfo;
280 MAGICKpfn_clGetProgramBuildInfo clGetProgramBuildInfo;
282 MAGICKpfn_clCreateKernel clCreateKernel;
283 MAGICKpfn_clReleaseKernel clReleaseKernel;
284 MAGICKpfn_clSetKernelArg clSetKernelArg;
286 MAGICKpfn_clEnqueueReadBuffer clEnqueueReadBuffer;
287 MAGICKpfn_clEnqueueMapBuffer clEnqueueMapBuffer;
288 MAGICKpfn_clEnqueueUnmapMemObject clEnqueueUnmapMemObject;
289 MAGICKpfn_clEnqueueNDRangeKernel clEnqueueNDRangeKernel;
291 MAGICKpfn_clGetEventProfilingInfo clGetEventProfilingInfo;
293 MAGICKpfn_clGetEventInfo clGetEventInfo;
294 MAGICKpfn_clWaitForEvents clWaitForEvents;
295 MAGICKpfn_clReleaseEvent clReleaseEvent;
296 MAGICKpfn_clRetainEvent clRetainEvent;
297 MAGICKpfn_clSetEventCallback clSetEventCallback;
304 MagickLibrary * library;
307 cl_platform_id platform;
308 cl_device_type deviceType;
319 cl_command_queue commandQueues[MAX_COMMAND_QUEUES];
320 ssize_t commandQueuesPos;
325#if defined(MAGICKCORE_HDRI_SUPPORT)
326#define CLOptions "-cl-single-precision-constant -cl-mad-enable -DMAGICKCORE_HDRI_SUPPORT=1 "\
327 "-DCLQuantum=float -DCLSignedQuantum=float -DCLPixelType=float4 -DQuantumRange=%f " \
328 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
329 " -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
330#define CLPixelPacket cl_float4
331#define CLCharQuantumScale 1.0f
332#elif (MAGICKCORE_QUANTUM_DEPTH == 8)
333#define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
334 "-DCLQuantum=uchar -DCLSignedQuantum=char -DCLPixelType=uchar4 -DQuantumRange=%ff " \
335 "-DQuantumScale=%ff -DCharQuantumScale=%ff -DMagickEpsilon=%ff -DMagickPI=%ff "\
336 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
337#define CLPixelPacket cl_uchar4
338#define CLCharQuantumScale 1.0f
339#elif (MAGICKCORE_QUANTUM_DEPTH == 16)
340#define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
341 "-DCLQuantum=ushort -DCLSignedQuantum=short -DCLPixelType=ushort4 -DQuantumRange=%f "\
342 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
343 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
344#define CLPixelPacket cl_ushort4
345#define CLCharQuantumScale 257.0f
346#elif (MAGICKCORE_QUANTUM_DEPTH == 32)
347#define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
348 "-DCLQuantum=uint -DCLSignedQuantum=int -DCLPixelType=uint4 -DQuantumRange=%f "\
349 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
350 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
351#define CLPixelPacket cl_uint4
352#define CLCharQuantumScale 16843009.0f
353#elif (MAGICKCORE_QUANTUM_DEPTH == 64)
354#define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
355 "-DCLQuantum=ulong -DCLSignedQuantum=long -DCLPixelType=ulong4 -DQuantumRange=%f "\
356 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
357 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
358#define CLPixelPacket cl_ulong4
359#define CLCharQuantumScale 72340172838076673.0f
367 ComputeFunctionKernel,
369 ContrastStretchKernel,
376 LocalContrastBlurRowKernel,
377 LocalContrastBlurApplyColumnKernel,
381 RandomNumberGeneratorKernel,
382 ResizeHorizontalKernel,
383 ResizeVerticalKernel,
384 UnsharpMaskBlurColumnKernel,
386 WaveletDenoiseKernel,
401 const char *,
const char *,
const size_t,
405 RelinquishOpenCLCommandQueue(
MagickCLEnv, cl_command_queue),
409 AcquireMagickOpenCLEnv(),
417 GetOpenCLCachedFilesDirectory();
420 OpenCLLog(
const char*),
424static inline void OpenCLLogException(
const char* function,
425 const unsigned int line,
427#ifdef OPENCLLOG_ENABLED
443#if defined(__cplusplus) || defined(c_plusplus)
ExceptionType
Definition: exception.h:29
MagickExport ssize_t FormatLocaleString(char *magick_restrict string, const size_t length, const char *magick_restrict format,...)
Definition: locale.c:497
MagickBooleanType
Definition: magick-type.h:199
#define MagickPrivate
Definition: method-attribute.h:81
#define MaxTextExtent
Definition: method-attribute.h:89
#define magick_unreferenced(x)
Definition: method-attribute.h:106
void * cl_mem
Definition: opencl-private.h:33
void * cl_uint
Definition: opencl-private.h:34
void * cl_event
Definition: opencl-private.h:32
MagickOpenCLProgram
Definition: opencl.h:27
@ MAGICK_OPENCL_NUM_PROGRAMS
Definition: opencl.h:29
Definition: semaphore.c:61
Definition: exception.h:103
char * reason
Definition: exception.h:111
ExceptionType severity
Definition: exception.h:105
Definition: opencl.c:3047
MagickBooleanType OpenCLInitialized
Definition: opencl.c:3048