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) 43 #define MAX_COMMAND_QUEUES 16 52 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformIDs)(
54 cl_platform_id * platforms,
55 cl_uint * num_platforms) CL_API_SUFFIX__VERSION_1_0;
57 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformInfo)(
58 cl_platform_id platform,
59 cl_platform_info param_name,
60 size_t param_value_size,
62 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
65 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceIDs)(
66 cl_platform_id platform,
69 cl_device_id * devices,
70 cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0;
72 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceInfo)(
74 cl_device_info param_name,
75 size_t param_value_size,
77 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
80 typedef CL_API_ENTRY
cl_context (CL_API_CALL *MAGICKpfn_clCreateContext)(
81 const cl_context_properties * properties,
83 const cl_device_id * devices,
84 void (CL_CALLBACK *pfn_notify)(
const char *,
const void *, size_t,
void *),
86 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
88 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseContext)(
89 cl_context context) CL_API_SUFFIX__VERSION_1_0;
92 typedef CL_API_ENTRY
cl_command_queue (CL_API_CALL *MAGICKpfn_clCreateCommandQueue)(
95 cl_command_queue_properties properties,
96 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
98 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
99 cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
102 typedef CL_API_ENTRY
cl_mem (CL_API_CALL *MAGICKpfn_clCreateBuffer)(
107 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
109 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0;
112 typedef 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;
119 typedef 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;
128 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
130 typedef 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;
138 typedef 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;
145 typedef 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;
154 typedef 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;
159 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0;
161 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clSetKernelArg)(
165 const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
167 typedef CL_API_ENTRY cl_int
168 (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue)
169 CL_API_SUFFIX__VERSION_1_0;
171 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFinish)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
174 typedef 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,
182 const cl_event * event_wait_list,
183 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
185 typedef 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,
193 const cl_event * event_wait_list,
195 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
197 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueUnmapMemObject)(
198 cl_command_queue command_queue,
201 cl_uint num_events_in_wait_list,
202 const cl_event * event_wait_list,
203 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
205 typedef 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,
213 const cl_event * event_wait_list,
214 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
216 typedef 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;
223 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clWaitForEvents)(
225 const cl_event *event_list) CL_API_SUFFIX__VERSION_1_0;
227 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clReleaseEvent)(
228 cl_event event) CL_API_SUFFIX__VERSION_1_0;
230 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clRetainEvent)(
231 cl_event event) CL_API_SUFFIX__VERSION_1_0;
233 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clSetEventCallback)(
234 cl_event event,cl_int command_exec_callback_type,
235 void (CL_CALLBACK *MAGICKpfn_notify)(
cl_event,cl_int,
void *),
236 void *user_data) CL_API_SUFFIX__VERSION_1_1;
247 typedef struct MagickLibraryRec MagickLibrary;
249 struct MagickLibraryRec
253 MAGICKpfn_clGetPlatformIDs clGetPlatformIDs;
254 MAGICKpfn_clGetPlatformInfo clGetPlatformInfo;
256 MAGICKpfn_clGetDeviceIDs clGetDeviceIDs;
257 MAGICKpfn_clGetDeviceInfo clGetDeviceInfo;
259 MAGICKpfn_clCreateContext clCreateContext;
260 MAGICKpfn_clReleaseContext clReleaseContext;
262 MAGICKpfn_clCreateCommandQueue clCreateCommandQueue;
263 MAGICKpfn_clReleaseCommandQueue clReleaseCommandQueue;
264 MAGICKpfn_clFlush clFlush;
265 MAGICKpfn_clFinish clFinish;
267 MAGICKpfn_clCreateBuffer clCreateBuffer;
268 MAGICKpfn_clReleaseMemObject clReleaseMemObject;
269 MAGICKpfn_clCreateProgramWithSource clCreateProgramWithSource;
270 MAGICKpfn_clCreateProgramWithBinary clCreateProgramWithBinary;
271 MAGICKpfn_clReleaseProgram clReleaseProgram;
272 MAGICKpfn_clBuildProgram clBuildProgram;
273 MAGICKpfn_clGetProgramInfo clGetProgramInfo;
274 MAGICKpfn_clGetProgramBuildInfo clGetProgramBuildInfo;
276 MAGICKpfn_clCreateKernel clCreateKernel;
277 MAGICKpfn_clReleaseKernel clReleaseKernel;
278 MAGICKpfn_clSetKernelArg clSetKernelArg;
280 MAGICKpfn_clEnqueueReadBuffer clEnqueueReadBuffer;
281 MAGICKpfn_clEnqueueMapBuffer clEnqueueMapBuffer;
282 MAGICKpfn_clEnqueueUnmapMemObject clEnqueueUnmapMemObject;
283 MAGICKpfn_clEnqueueNDRangeKernel clEnqueueNDRangeKernel;
285 MAGICKpfn_clGetEventProfilingInfo clGetEventProfilingInfo;
287 MAGICKpfn_clWaitForEvents clWaitForEvents;
288 MAGICKpfn_clReleaseEvent clReleaseEvent;
289 MAGICKpfn_clRetainEvent clRetainEvent;
290 MAGICKpfn_clSetEventCallback clSetEventCallback;
297 MagickLibrary * library;
300 cl_platform_id platform;
312 cl_command_queue commandQueues[MAX_COMMAND_QUEUES];
313 ssize_t commandQueuesPos;
319 #if defined(MAGICKCORE_HDRI_SUPPORT) 320 #define CLOptions "-cl-single-precision-constant -cl-mad-enable -DMAGICKCORE_HDRI_SUPPORT=1 "\ 321 "-DCLQuantum=float -DCLSignedQuantum=float -DCLPixelType=float4 -DQuantumRange=%f " \ 322 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\ 323 " -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 324 #define CLPixelPacket cl_float4 325 #define CLCharQuantumScale 1.0f 326 #elif (MAGICKCORE_QUANTUM_DEPTH == 8) 327 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \ 328 "-DCLQuantum=uchar -DCLSignedQuantum=char -DCLPixelType=uchar4 -DQuantumRange=%ff " \ 329 "-DQuantumScale=%ff -DCharQuantumScale=%ff -DMagickEpsilon=%ff -DMagickPI=%ff "\ 330 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 331 #define CLPixelPacket cl_uchar4 332 #define CLCharQuantumScale 1.0f 333 #elif (MAGICKCORE_QUANTUM_DEPTH == 16) 334 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \ 335 "-DCLQuantum=ushort -DCLSignedQuantum=short -DCLPixelType=ushort4 -DQuantumRange=%f "\ 336 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\ 337 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 338 #define CLPixelPacket cl_ushort4 339 #define CLCharQuantumScale 257.0f 340 #elif (MAGICKCORE_QUANTUM_DEPTH == 32) 341 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \ 342 "-DCLQuantum=uint -DCLSignedQuantum=int -DCLPixelType=uint4 -DQuantumRange=%f "\ 343 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\ 344 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 345 #define CLPixelPacket cl_uint4 346 #define CLCharQuantumScale 16843009.0f 347 #elif (MAGICKCORE_QUANTUM_DEPTH == 64) 348 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \ 349 "-DCLQuantum=ulong -DCLSignedQuantum=long -DCLPixelType=ulong4 -DQuantumRange=%f "\ 350 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\ 351 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u" 352 #define CLPixelPacket cl_ulong4 353 #define CLCharQuantumScale 72340172838076673.0f 395 const char *,
const char *,
const size_t,
416 const unsigned int line,
418 #ifdef OPENCLLOG_ENABLED 434 #if defined(__cplusplus) || defined(c_plusplus) Definition: opencl-private.h:380
Definition: opencl-private.h:370
MagickPrivate cl_command_queue AcquireOpenCLCommandQueue(MagickCLEnv)
void * cl_event
Definition: opencl-private.h:35
Definition: exception.h:102
Definition: opencl-private.h:369
Definition: opencl-private.h:381
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:470
Definition: opencl-private.h:364
void(MagickDLLCall *delete_instance)(gs_main_instance *)
Definition: opencl-private.h:359
void * cl_device_id
Definition: opencl-private.h:34
MagickPrivate unsigned long GetOpenCLDeviceLocalMemorySize(MagickCLEnv)
Definition: opencl-private.h:372
ExceptionType
Definition: exception.h:28
Definition: opencl-private.h:375
void * cl_platform_id
Definition: opencl-private.h:38
MagickPrivate void OpenCLTerminus()
Definition: opencl.c:3128
Definition: opencl-private.h:368
MagickBooleanType
Definition: magick-type.h:211
Definition: opencl-private.h:377
void * cl_kernel
Definition: opencl-private.h:36
char * reason
Definition: exception.h:111
void * cl_uint
Definition: opencl-private.h:39
Definition: opencl-private.h:358
MagickPrivate const char * GetOpenCLCachedFilesDirectory()
Definition: opencl.c:2965
void * cl_context
Definition: opencl-private.h:32
#define MaxTextExtent
Definition: method-attribute.h:106
Definition: opencl-private.h:360
Definition: opencl-private.h:379
MagickOpenCLProgram
Definition: opencl.h:27
MagickPrivate cl_kernel AcquireOpenCLKernel(MagickCLEnv, MagickOpenCLProgram, const char *)
MagickPrivate void OpenCLLog(const char *)
Definition: opencl.c:3088
MagickPrivate MagickBooleanType OpenCLThrowMagickException(ExceptionInfo *, const char *, const char *, const size_t, const ExceptionType, const char *, const char *,...)
Definition: opencl-private.h:365
MagickPrivate cl_context GetOpenCLContext(MagickCLEnv)
Definition: opencl-private.h:361
Definition: opencl-private.h:376
void * cl_mem
Definition: opencl-private.h:37
Definition: opencl-private.h:40
Definition: opencl-private.h:373
Definition: opencl-private.h:363
#define magick_unreferenced(x)
Definition: method-attribute.h:123
ProfiledKernels
Definition: opencl-private.h:356
Definition: opencl-private.h:357
#define MagickPrivate
Definition: method-attribute.h:99
Definition: opencl-private.h:371
static void OpenCLLogException(const char *function, const unsigned int line, ExceptionInfo *exception)
Definition: opencl-private.h:415
Definition: opencl-private.h:367
MagickPrivate MagickBooleanType RecordProfileData(MagickCLEnv, ProfiledKernels, cl_event)
Definition: opencl-private.h:366
Definition: opencl-private.h:374
Definition: semaphore.c:58
Definition: opencl-private.h:378
Definition: opencl-private.h:362
Definition: opencl.c:2816
MagickPrivate MagickBooleanType RelinquishOpenCLKernel(MagickCLEnv, cl_kernel)
ExceptionType severity
Definition: exception.h:105