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)
40typedef void* MagickCLCacheInfo;
42typedef struct _MagickCLCacheInfo
69#define MAGICKCORE_OPENCL_UNDEFINED_SCORE -1.0
70#define MAGICKCORE_OPENCL_COMMAND_QUEUES 16
73typedef 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;
77typedef 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;
84typedef 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;
89typedef 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;
96typedef 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;
103typedef CL_API_ENTRY cl_int
104 (CL_API_CALL *MAGICKpfn_clReleaseContext)(cl_context context)
105 CL_API_SUFFIX__VERSION_1_0;
109typedef 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;
114typedef CL_API_ENTRY cl_int
115 (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
116 cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
118typedef CL_API_ENTRY cl_int
119 (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue)
120 CL_API_SUFFIX__VERSION_1_0;
122typedef CL_API_ENTRY cl_int
123 (CL_API_CALL *MAGICKpfn_clFinish)(cl_command_queue command_queue)
124 CL_API_SUFFIX__VERSION_1_0;
128typedef 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;
133typedef CL_API_ENTRY cl_int
134 (CL_API_CALL *MAGICKpfn_clRetainMemObject)(cl_mem memobj)
135 CL_API_SUFFIX__VERSION_1_0;
137typedef CL_API_ENTRY cl_int
138 (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj)
139 CL_API_SUFFIX__VERSION_1_0;
143typedef 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;
148typedef 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;
154typedef CL_API_ENTRY cl_int
155 (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program)
156 CL_API_SUFFIX__VERSION_1_0;
158typedef 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;
164typedef 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;
169typedef 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;
176typedef 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;
180typedef CL_API_ENTRY cl_int
181 (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel kernel)
182 CL_API_SUFFIX__VERSION_1_0;
184typedef 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;
188typedef 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;
195typedef 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;
201typedef 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;
207typedef 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;
213typedef 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;
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
229 (CL_API_CALL *MAGICKpfn_clWaitForEvents)(cl_uint num_events,
230 const cl_event *event_list) CL_API_SUFFIX__VERSION_1_0;
232typedef CL_API_ENTRY cl_int
233 (CL_API_CALL *MAGICKpfn_clReleaseEvent)(cl_event event)
234 CL_API_SUFFIX__VERSION_1_0;
236typedef CL_API_ENTRY cl_int
237 (CL_API_CALL *MAGICKpfn_clRetainEvent)(cl_event event)
238 CL_API_SUFFIX__VERSION_1_0;
240typedef 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;
247typedef 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;
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;
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;
302struct _MagickCLDevice
310 command_queues[MAGICKCORE_OPENCL_COMMAND_QUEUES];
348 command_queues_index;
354typedef 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
420extern MagickPrivate cl_command_queue
421 AcquireOpenCLCommandQueue(MagickCLDevice);
423extern MagickPrivate cl_int
424 SetOpenCLKernelArg(cl_kernel,
size_t,
size_t,
const void *);
426extern MagickPrivate cl_kernel
427 AcquireOpenCLKernel(MagickCLDevice,
const char *);
429extern MagickPrivate cl_mem
430 CreateOpenCLBuffer(MagickCLDevice,cl_mem_flags,
size_t,
void *);
432extern 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);
442extern MagickPrivate MagickCLCacheInfo
443 AcquireMagickCLCacheInfo(MagickCLDevice,Quantum *,
const MagickSizeType),
444 CopyMagickCLCacheInfo(MagickCLCacheInfo),
445 RelinquishMagickCLCacheInfo(MagickCLCacheInfo,
const MagickBooleanType);
447extern MagickPrivate MagickCLDevice
448 RequestOpenCLDevice(MagickCLEnv);
450extern MagickPrivate MagickCLEnv
451 GetCurrentOpenCLEnv(
void);
453extern MagickPrivate
unsigned long
454 GetOpenCLDeviceLocalMemorySize(
const MagickCLDevice);
456extern 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)