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 46 typedef 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;
51 typedef 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;
59 typedef 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;
66 typedef 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;
74 typedef 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;
82 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseContext)(
83 cl_context context) CL_API_SUFFIX__VERSION_1_0;
86 typedef 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;
92 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
93 cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
96 typedef CL_API_ENTRY
cl_mem (CL_API_CALL *MAGICKpfn_clCreateBuffer)(
101 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
103 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0;
106 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithSource)(
109 const char ** strings,
110 const size_t * lengths,
111 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
113 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithBinary)(
116 const cl_device_id * device_list,
117 const size_t * lengths,
118 const unsigned char ** binaries,
119 cl_int * binary_status,
120 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
122 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
124 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clBuildProgram)(
127 const cl_device_id * device_list,
128 const char * options,
129 void (CL_CALLBACK *pfn_notify)(cl_program program,
void * user_data),
130 void * user_data) CL_API_SUFFIX__VERSION_1_0;
132 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramInfo)(
134 cl_program_info param_name,
135 size_t param_value_size,
137 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
139 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramBuildInfo)(
142 cl_program_build_info param_name,
143 size_t param_value_size,
145 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
148 typedef CL_API_ENTRY cl_kernel (CL_API_CALL *MAGICKpfn_clCreateKernel)(
150 const char * kernel_name,
151 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
153 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0;
155 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clSetKernelArg)(
159 const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
161 typedef CL_API_ENTRY cl_int
162 (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue)
163 CL_API_SUFFIX__VERSION_1_0;
165 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFinish)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
168 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueReadBuffer)(
169 cl_command_queue command_queue,
171 cl_bool blocking_read,
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;
179 typedef CL_API_ENTRY
void * (CL_API_CALL *MAGICKpfn_clEnqueueMapBuffer)(
180 cl_command_queue command_queue,
182 cl_bool blocking_map,
183 cl_map_flags map_flags,
186 cl_uint num_events_in_wait_list,
187 const cl_event * event_wait_list,
189 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
191 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueUnmapMemObject)(
192 cl_command_queue command_queue,
195 cl_uint num_events_in_wait_list,
196 const cl_event * event_wait_list,
197 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
199 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueNDRangeKernel)(
200 cl_command_queue command_queue,
203 const size_t * global_work_offset,
204 const size_t * global_work_size,
205 const size_t * local_work_size,
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;
210 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clGetEventProfilingInfo)(
212 cl_profiling_info param_name,
213 size_t param_value_size,
215 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
217 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clWaitForEvents)(
219 const cl_event *event_list) CL_API_SUFFIX__VERSION_1_0;
221 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clReleaseEvent)(
222 cl_event event) CL_API_SUFFIX__VERSION_1_0;
224 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clRetainEvent)(
225 cl_event event) CL_API_SUFFIX__VERSION_1_0;
227 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clSetEventCallback)(
228 cl_event event,cl_int command_exec_callback_type,
229 void (CL_CALLBACK *MAGICKpfn_notify)(
cl_event,cl_int,
void *),
230 void *user_data) CL_API_SUFFIX__VERSION_1_1;
241 typedef struct MagickLibraryRec MagickLibrary;
243 struct MagickLibraryRec
247 MAGICKpfn_clGetPlatformIDs clGetPlatformIDs;
248 MAGICKpfn_clGetPlatformInfo clGetPlatformInfo;
250 MAGICKpfn_clGetDeviceIDs clGetDeviceIDs;
251 MAGICKpfn_clGetDeviceInfo clGetDeviceInfo;
253 MAGICKpfn_clCreateContext clCreateContext;
254 MAGICKpfn_clReleaseContext clReleaseContext;
256 MAGICKpfn_clCreateCommandQueue clCreateCommandQueue;
257 MAGICKpfn_clReleaseCommandQueue clReleaseCommandQueue;
258 MAGICKpfn_clFlush clFlush;
259 MAGICKpfn_clFinish clFinish;
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;
270 MAGICKpfn_clCreateKernel clCreateKernel;
271 MAGICKpfn_clReleaseKernel clReleaseKernel;
272 MAGICKpfn_clSetKernelArg clSetKernelArg;
274 MAGICKpfn_clEnqueueReadBuffer clEnqueueReadBuffer;
275 MAGICKpfn_clEnqueueMapBuffer clEnqueueMapBuffer;
276 MAGICKpfn_clEnqueueUnmapMemObject clEnqueueUnmapMemObject;
277 MAGICKpfn_clEnqueueNDRangeKernel clEnqueueNDRangeKernel;
279 MAGICKpfn_clGetEventProfilingInfo clGetEventProfilingInfo;
281 MAGICKpfn_clWaitForEvents clWaitForEvents;
282 MAGICKpfn_clReleaseEvent clReleaseEvent;
283 MAGICKpfn_clRetainEvent clRetainEvent;
284 MAGICKpfn_clSetEventCallback clSetEventCallback;
291 MagickLibrary * library;
294 cl_platform_id platform;
295 cl_device_type deviceType;
306 cl_command_queue commandQueues[MAX_COMMAND_QUEUES];
307 ssize_t commandQueuesPos;
312 #if defined(MAGICKCORE_HDRI_SUPPORT) 313 #define CLOptions "-cl-single-precision-constant -cl-mad-enable -DMAGICKCORE_HDRI_SUPPORT=1 "\ 314 "-DCLQuantum=float -DCLSignedQuantum=float -DCLPixelType=float4 -DQuantumRange=%f " \ 315 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\ 316 " -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 317 #define CLPixelPacket cl_float4 318 #define CLCharQuantumScale 1.0f 319 #elif (MAGICKCORE_QUANTUM_DEPTH == 8) 320 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \ 321 "-DCLQuantum=uchar -DCLSignedQuantum=char -DCLPixelType=uchar4 -DQuantumRange=%ff " \ 322 "-DQuantumScale=%ff -DCharQuantumScale=%ff -DMagickEpsilon=%ff -DMagickPI=%ff "\ 323 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 324 #define CLPixelPacket cl_uchar4 325 #define CLCharQuantumScale 1.0f 326 #elif (MAGICKCORE_QUANTUM_DEPTH == 16) 327 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \ 328 "-DCLQuantum=ushort -DCLSignedQuantum=short -DCLPixelType=ushort4 -DQuantumRange=%f "\ 329 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\ 330 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 331 #define CLPixelPacket cl_ushort4 332 #define CLCharQuantumScale 257.0f 333 #elif (MAGICKCORE_QUANTUM_DEPTH == 32) 334 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \ 335 "-DCLQuantum=uint -DCLSignedQuantum=int -DCLPixelType=uint4 -DQuantumRange=%f "\ 336 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\ 337 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 338 #define CLPixelPacket cl_uint4 339 #define CLCharQuantumScale 16843009.0f 340 #elif (MAGICKCORE_QUANTUM_DEPTH == 64) 341 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \ 342 "-DCLQuantum=ulong -DCLSignedQuantum=long -DCLPixelType=ulong4 -DQuantumRange=%f "\ 343 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\ 344 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 345 #define CLPixelPacket cl_ulong4 346 #define CLCharQuantumScale 72340172838076673.0f 354 ComputeFunctionKernel,
356 ContrastStretchKernel,
363 LocalContrastBlurRowKernel,
364 LocalContrastBlurApplyColumnKernel,
368 RandomNumberGeneratorKernel,
369 ResizeHorizontalKernel,
370 ResizeVerticalKernel,
371 UnsharpMaskBlurColumnKernel,
373 WaveletDenoiseKernel,
388 const char *,
const char *,
const size_t,
390 RecordProfileData(
MagickCLEnv,ProfiledKernels,cl_event),
392 RelinquishOpenCLCommandQueue(
MagickCLEnv, cl_command_queue),
396 AcquireMagickOpenCLEnv(),
404 GetOpenCLCachedFilesDirectory();
407 OpenCLLog(
const char*);
413 static inline void OpenCLLogException(
const char*
function,
414 const unsigned int line,
416 #ifdef OPENCLLOG_ENABLED 432 #if defined(__cplusplus) || defined(c_plusplus) void * cl_event
Definition: opencl-private.h:32
Definition: exception.h:102
MagickExport ssize_t FormatLocaleString(char *magick_restrict string, const size_t length, const char *magick_restrict format,...)
Definition: locale.c:470
void(MagickDLLCall *delete_instance)(gs_main_instance *)
ExceptionType
Definition: exception.h:28
MagickBooleanType
Definition: magick-type.h:215
char * reason
Definition: exception.h:111
void * cl_uint
Definition: opencl-private.h:34
#define MaxTextExtent
Definition: method-attribute.h:106
MagickOpenCLProgram
Definition: opencl.h:27
void * cl_mem
Definition: opencl-private.h:33
#define magick_unreferenced(x)
Definition: method-attribute.h:123
#define MagickPrivate
Definition: method-attribute.h:99
Definition: semaphore.c:58
Definition: opencl.c:3033
ExceptionType severity
Definition: exception.h:105