18 #ifndef MAGICKCORE_OPENCL_PRIVATE_H
19 #define MAGICKCORE_OPENCL_PRIVATE_H
24 #include "MagickCore/studio.h"
25 #include "MagickCore/opencl.h"
26 #include "MagickCore/thread_.h"
28 #if defined(MAGICKCORE_HAVE_CL_CL_H)
31 #if defined(MAGICKCORE_HAVE_OPENCL_CL_H)
32 # include <OpenCL/cl.h>
35 #if defined(__cplusplus) || defined(c_plusplus)
39 #if !defined(MAGICKCORE_OPENCL_SUPPORT)
40 typedef void* MagickCLCacheInfo;
42 typedef struct _MagickCLCacheInfo
69 #define MAGICKCORE_OPENCL_UNDEFINED_SCORE -1.0
70 #define MAGICKCORE_OPENCL_COMMAND_QUEUES 16
73 typedef CL_API_ENTRY cl_int
74 (CL_API_CALL *MAGICKpfn_clGetPlatformIDs)(cl_uint num_entries,
75 cl_platform_id *platforms,cl_uint *num_platforms) CL_API_SUFFIX__VERSION_1_0;
77 typedef CL_API_ENTRY cl_int
78 (CL_API_CALL *MAGICKpfn_clGetPlatformInfo)(cl_platform_id platform,
79 cl_platform_info param_name,
size_t param_value_size,
void *param_value,
80 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
84 typedef CL_API_ENTRY cl_int
85 (CL_API_CALL *MAGICKpfn_clGetDeviceIDs)(cl_platform_id platform,
86 cl_device_type device_type,cl_uint num_entries,cl_device_id *devices,
87 cl_uint *num_devices) CL_API_SUFFIX__VERSION_1_0;
89 typedef CL_API_ENTRY cl_int
90 (CL_API_CALL *MAGICKpfn_clGetDeviceInfo)(cl_device_id device,
91 cl_device_info param_name,
size_t param_value_size,
void *param_value,
92 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
96 typedef CL_API_ENTRY cl_context
97 (CL_API_CALL *MAGICKpfn_clCreateContext)(
98 const cl_context_properties *properties,cl_uint num_devices,
99 const cl_device_id *devices,void (CL_CALLBACK *pfn_notify)(
const char *,
100 const void *,size_t,
void *),
void *user_data,cl_int *errcode_ret)
101 CL_API_SUFFIX__VERSION_1_0;
103 typedef CL_API_ENTRY cl_int
104 (CL_API_CALL *MAGICKpfn_clReleaseContext)(cl_context context)
105 CL_API_SUFFIX__VERSION_1_0;
109 typedef CL_API_ENTRY cl_command_queue
110 (CL_API_CALL *MAGICKpfn_clCreateCommandQueue)(cl_context context,
111 cl_device_id device,cl_command_queue_properties properties,
112 cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0;
114 typedef CL_API_ENTRY cl_int
115 (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
116 cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
118 typedef CL_API_ENTRY cl_int
119 (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue)
120 CL_API_SUFFIX__VERSION_1_0;
122 typedef CL_API_ENTRY cl_int
123 (CL_API_CALL *MAGICKpfn_clFinish)(cl_command_queue command_queue)
124 CL_API_SUFFIX__VERSION_1_0;
128 typedef CL_API_ENTRY cl_mem
129 (CL_API_CALL *MAGICKpfn_clCreateBuffer)(cl_context context,
130 cl_mem_flags flags,
size_t size,
void *host_ptr,cl_int *errcode_ret)
131 CL_API_SUFFIX__VERSION_1_0;
133 typedef CL_API_ENTRY cl_int
134 (CL_API_CALL *MAGICKpfn_clRetainMemObject)(cl_mem memobj)
135 CL_API_SUFFIX__VERSION_1_0;
137 typedef CL_API_ENTRY cl_int
138 (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj)
139 CL_API_SUFFIX__VERSION_1_0;
143 typedef CL_API_ENTRY cl_program
144 (CL_API_CALL *MAGICKpfn_clCreateProgramWithSource)(cl_context context,
145 cl_uint count,
const char **strings,
const size_t *lengths,
146 cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0;
148 typedef CL_API_ENTRY cl_program
149 (CL_API_CALL *MAGICKpfn_clCreateProgramWithBinary)(cl_context context,
150 cl_uint num_devices,
const cl_device_id *device_list,
const size_t *lengths,
151 const unsigned char **binaries,cl_int *binary_status,cl_int *errcode_ret)
152 CL_API_SUFFIX__VERSION_1_0;
154 typedef CL_API_ENTRY cl_int
155 (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program)
156 CL_API_SUFFIX__VERSION_1_0;
158 typedef CL_API_ENTRY cl_int
159 (CL_API_CALL *MAGICKpfn_clBuildProgram)(cl_program program,
160 cl_uint num_devices,
const cl_device_id *device_list,
const char *options,
161 void (CL_CALLBACK *pfn_notify)(cl_program program,
void * user_data),
162 void *user_data) CL_API_SUFFIX__VERSION_1_0;
164 typedef CL_API_ENTRY cl_int
165 (CL_API_CALL *MAGICKpfn_clGetProgramBuildInfo)(cl_program program,
166 cl_device_id device,cl_program_build_info param_name,
size_t param_value_size,
167 void *param_value,
size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
169 typedef CL_API_ENTRY cl_int
170 (CL_API_CALL *MAGICKpfn_clGetProgramInfo)(cl_program program,
171 cl_program_info param_name,
size_t param_value_size,
void *param_value,
172 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
176 typedef CL_API_ENTRY cl_kernel
177 (CL_API_CALL *MAGICKpfn_clCreateKernel)(cl_program program,
178 const char *kernel_name,cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0;
180 typedef CL_API_ENTRY cl_int
181 (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel kernel)
182 CL_API_SUFFIX__VERSION_1_0;
184 typedef CL_API_ENTRY cl_int
185 (CL_API_CALL *MAGICKpfn_clSetKernelArg)(cl_kernel kernel,cl_uint arg_index,
186 size_t arg_size,
const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
188 typedef CL_API_ENTRY cl_int
189 (CL_API_CALL *MAGICKpfn_clGetKernelInfo)(cl_kernel kernel,
190 cl_kernel_info param_name,
size_t param_value_size,
void *param_value,
191 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
195 typedef CL_API_ENTRY cl_int
196 (CL_API_CALL *MAGICKpfn_clEnqueueReadBuffer)(cl_command_queue command_queue,
197 cl_mem buffer,cl_bool blocking_read,
size_t offset,
size_t cb,
void *ptr,
198 cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
199 cl_event *event) CL_API_SUFFIX__VERSION_1_0;
201 typedef CL_API_ENTRY
void
202 *(CL_API_CALL *MAGICKpfn_clEnqueueMapBuffer)(cl_command_queue command_queue,
203 cl_mem buffer,cl_bool blocking_map,cl_map_flags map_flags,
size_t offset,
204 size_t cb,cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
205 cl_event *event,cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0;
207 typedef CL_API_ENTRY cl_int
208 (CL_API_CALL *MAGICKpfn_clEnqueueUnmapMemObject)(
209 cl_command_queue command_queue,cl_mem memobj,
void *mapped_ptr,
210 cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
211 cl_event *event) CL_API_SUFFIX__VERSION_1_0;
213 typedef CL_API_ENTRY cl_int
214 (CL_API_CALL *MAGICKpfn_clEnqueueNDRangeKernel)(
215 cl_command_queue command_queue,cl_kernel kernel,cl_uint work_dim,
216 const size_t *global_work_offset,
const size_t *global_work_size,
217 const size_t *local_work_size,cl_uint num_events_in_wait_list,
218 const cl_event * event_wait_list,cl_event *event)
219 CL_API_SUFFIX__VERSION_1_0;
223 typedef 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;
228 typedef CL_API_ENTRY cl_int
229 (CL_API_CALL *MAGICKpfn_clWaitForEvents)(cl_uint num_events,
230 const cl_event *event_list) CL_API_SUFFIX__VERSION_1_0;
232 typedef CL_API_ENTRY cl_int
233 (CL_API_CALL *MAGICKpfn_clReleaseEvent)(cl_event event)
234 CL_API_SUFFIX__VERSION_1_0;
236 typedef CL_API_ENTRY cl_int
237 (CL_API_CALL *MAGICKpfn_clRetainEvent)(cl_event event)
238 CL_API_SUFFIX__VERSION_1_0;
240 typedef CL_API_ENTRY cl_int
241 (CL_API_CALL *MAGICKpfn_clSetEventCallback)(cl_event event,
242 cl_int command_exec_callback_type,void (CL_CALLBACK *MAGICKpfn_notify)(
243 cl_event,cl_int,
void *),
void *user_data) CL_API_SUFFIX__VERSION_1_1;
247 typedef CL_API_ENTRY cl_int
248 (CL_API_CALL *MAGICKpfn_clGetEventProfilingInfo)(cl_event event,
249 cl_profiling_info param_name,
size_t param_value_size,
void *param_value,
250 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
252 typedef struct MagickLibraryRec MagickLibrary;
254 struct 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;
276 MAGICKpfn_clCreateProgramWithSource clCreateProgramWithSource;
277 MAGICKpfn_clCreateProgramWithBinary clCreateProgramWithBinary;
278 MAGICKpfn_clReleaseProgram clReleaseProgram;
279 MAGICKpfn_clBuildProgram clBuildProgram;
280 MAGICKpfn_clGetProgramBuildInfo clGetProgramBuildInfo;
281 MAGICKpfn_clGetProgramInfo clGetProgramInfo;
283 MAGICKpfn_clCreateKernel clCreateKernel;
284 MAGICKpfn_clReleaseKernel clReleaseKernel;
285 MAGICKpfn_clSetKernelArg clSetKernelArg;
286 MAGICKpfn_clGetKernelInfo clGetKernelInfo;
288 MAGICKpfn_clEnqueueReadBuffer clEnqueueReadBuffer;
289 MAGICKpfn_clEnqueueMapBuffer clEnqueueMapBuffer;
290 MAGICKpfn_clEnqueueUnmapMemObject clEnqueueUnmapMemObject;
291 MAGICKpfn_clEnqueueNDRangeKernel clEnqueueNDRangeKernel;
293 MAGICKpfn_clGetEventInfo clGetEventInfo;
294 MAGICKpfn_clWaitForEvents clWaitForEvents;
295 MAGICKpfn_clReleaseEvent clReleaseEvent;
296 MAGICKpfn_clRetainEvent clRetainEvent;
297 MAGICKpfn_clSetEventCallback clSetEventCallback;
299 MAGICKpfn_clGetEventProfilingInfo clGetEventProfilingInfo;
302 struct _MagickCLDevice
310 command_queues[MAGICKCORE_OPENCL_COMMAND_QUEUES];
348 command_queues_index;
354 typedef struct _MagickCLEnv
383 #if defined(MAGICKCORE_HDRI_SUPPORT)
384 #define CLOptions "-cl-single-precision-constant -cl-mad-enable -DMAGICKCORE_HDRI_SUPPORT=1 "\
385 "-DCLQuantum=float -DCLSignedQuantum=float -DCLPixelType=float4 -DQuantumRange=%ff " \
386 "-DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
387 #define CLQuantum cl_float
388 #define CLPixelPacket cl_float4
389 #define CLCharQuantumScale 1.0f
390 #elif (MAGICKCORE_QUANTUM_DEPTH == 8)
391 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
392 "-DCLQuantum=uchar -DCLSignedQuantum=char -DCLPixelType=uchar4 -DQuantumRange=%ff " \
393 "-DCharQuantumScale=%ff -DMagickEpsilon=%ff -DMagickPI=%ff -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
394 #define CLQuantum cl_uchar
395 #define CLPixelPacket cl_uchar4
396 #define CLCharQuantumScale 1.0f
397 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
398 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
399 "-DCLQuantum=ushort -DCLSignedQuantum=short -DCLPixelType=ushort4 -DQuantumRange=%ff "\
400 "-DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
401 #define CLQuantum cl_ushort
402 #define CLPixelPacket cl_ushort4
403 #define CLCharQuantumScale 257.0f
404 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
405 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
406 "-DCLQuantum=uint -DCLSignedQuantum=int -DCLPixelType=uint4 -DQuantumRange=%ff "\
407 "-DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
408 #define CLQuantum cl_uint
409 #define CLPixelPacket cl_uint4
410 #define CLCharQuantumScale 16843009.0f
411 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
412 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
413 "-DCLQuantum=ulong -DCLSignedQuantum=long -DCLPixelType=ulong4 -DQuantumRange=%ff "\
414 "-DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
415 #define CLQuantum cl_ulong
416 #define CLPixelPacket cl_ulong4
417 #define CLCharQuantumScale 72340172838076673.0f
420 extern MagickPrivate cl_command_queue
421 AcquireOpenCLCommandQueue(MagickCLDevice);
423 extern MagickPrivate cl_int
424 SetOpenCLKernelArg(cl_kernel,
size_t,
size_t,
const void *);
426 extern MagickPrivate cl_kernel
427 AcquireOpenCLKernel(MagickCLDevice,
const char *);
429 extern MagickPrivate cl_mem
430 CreateOpenCLBuffer(MagickCLDevice,cl_mem_flags,
size_t,
void *);
432 extern MagickPrivate MagickBooleanType
433 EnqueueOpenCLKernel(cl_command_queue,cl_kernel,cl_uint,
const size_t *,
434 const size_t *,
const size_t *,
const Image *,
const Image *,
438 const char *,
const char *,
const size_t,
const ExceptionType,
const char *,
440 RecordProfileData(MagickCLDevice,cl_kernel,cl_event);
442 extern MagickPrivate MagickCLCacheInfo
443 AcquireMagickCLCacheInfo(MagickCLDevice,Quantum *,
const MagickSizeType),
444 CopyMagickCLCacheInfo(MagickCLCacheInfo),
445 RelinquishMagickCLCacheInfo(MagickCLCacheInfo,
const MagickBooleanType);
447 extern MagickPrivate MagickCLDevice
448 RequestOpenCLDevice(MagickCLEnv);
450 extern MagickPrivate MagickCLEnv
451 GetCurrentOpenCLEnv(
void);
453 extern MagickPrivate
unsigned long
454 GetOpenCLDeviceLocalMemorySize(
const MagickCLDevice);
456 extern MagickPrivate
void
457 DumpOpenCLProfileData(),
459 ReleaseOpenCLCommandQueue(MagickCLDevice,cl_command_queue),
460 ReleaseOpenCLDevice(MagickCLDevice),
461 ReleaseOpenCLKernel(cl_kernel),
462 ReleaseOpenCLMemObject(cl_mem),
463 RetainOpenCLEvent(cl_event),
464 RetainOpenCLMemObject(cl_mem);
468 #if defined(__cplusplus) || defined(c_plusplus)