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)
47 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformIDs)(
49 cl_platform_id * platforms,
50 cl_uint * num_platforms) CL_API_SUFFIX__VERSION_1_0;
52 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformInfo)(
53 cl_platform_id platform,
54 cl_platform_info param_name,
55 size_t param_value_size,
57 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
60 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceIDs)(
61 cl_platform_id platform,
64 cl_device_id * devices,
65 cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0;
67 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceInfo)(
69 cl_device_info param_name,
70 size_t param_value_size,
72 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
75 typedef CL_API_ENTRY
cl_context (CL_API_CALL *MAGICKpfn_clCreateContext)(
76 const cl_context_properties * properties,
78 const cl_device_id * devices,
79 void (CL_CALLBACK *pfn_notify)(
const char *,
const void *, size_t,
void *),
81 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
83 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseContext)(
84 cl_context context) CL_API_SUFFIX__VERSION_1_0;
87 typedef CL_API_ENTRY
cl_command_queue (CL_API_CALL *MAGICKpfn_clCreateCommandQueue)(
90 cl_command_queue_properties properties,
91 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
93 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
94 cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
97 typedef CL_API_ENTRY
cl_mem (CL_API_CALL *MAGICKpfn_clCreateBuffer)(
102 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
104 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0;
107 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithSource)(
110 const char ** strings,
111 const size_t * lengths,
112 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
114 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithBinary)(
117 const cl_device_id * device_list,
118 const size_t * lengths,
119 const unsigned char ** binaries,
120 cl_int * binary_status,
121 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
123 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
125 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clBuildProgram)(
128 const cl_device_id * device_list,
129 const char * options,
130 void (CL_CALLBACK *pfn_notify)(cl_program program,
void * user_data),
131 void * user_data) CL_API_SUFFIX__VERSION_1_0;
133 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramInfo)(
135 cl_program_info param_name,
136 size_t param_value_size,
138 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
140 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramBuildInfo)(
143 cl_program_build_info param_name,
144 size_t param_value_size,
146 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
149 typedef CL_API_ENTRY
cl_kernel (CL_API_CALL *MAGICKpfn_clCreateKernel)(
151 const char * kernel_name,
152 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
154 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0;
156 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clSetKernelArg)(
160 const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
163 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue) 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 cl_int (CL_API_CALL *MAGICKpfn_clEnqueueWriteBuffer)(
180 cl_command_queue command_queue,
182 cl_bool blocking_write,
186 cl_uint num_events_in_wait_list,
187 const cl_event * event_wait_list,
188 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
190 typedef CL_API_ENTRY
void * (CL_API_CALL *MAGICKpfn_clEnqueueMapBuffer)(
191 cl_command_queue command_queue,
193 cl_bool blocking_map,
194 cl_map_flags map_flags,
197 cl_uint num_events_in_wait_list,
198 const cl_event * event_wait_list,
200 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
202 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueUnmapMemObject)(
203 cl_command_queue command_queue,
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_clEnqueueNDRangeKernel)(
211 cl_command_queue command_queue,
214 const size_t * global_work_offset,
215 const size_t * global_work_size,
216 const size_t * local_work_size,
217 cl_uint num_events_in_wait_list,
218 const cl_event * event_wait_list,
219 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
230 typedef struct MagickLibraryRec MagickLibrary;
232 struct MagickLibraryRec
236 MAGICKpfn_clGetPlatformIDs clGetPlatformIDs;
237 MAGICKpfn_clGetPlatformInfo clGetPlatformInfo;
238 MAGICKpfn_clGetDeviceIDs clGetDeviceIDs;
239 MAGICKpfn_clGetDeviceInfo clGetDeviceInfo;
240 MAGICKpfn_clCreateContext clCreateContext;
241 MAGICKpfn_clCreateCommandQueue clCreateCommandQueue;
242 MAGICKpfn_clReleaseCommandQueue clReleaseCommandQueue;
243 MAGICKpfn_clCreateBuffer clCreateBuffer;
244 MAGICKpfn_clReleaseMemObject clReleaseMemObject;
245 MAGICKpfn_clCreateProgramWithSource clCreateProgramWithSource;
246 MAGICKpfn_clCreateProgramWithBinary clCreateProgramWithBinary;
247 MAGICKpfn_clReleaseProgram clReleaseProgram;
248 MAGICKpfn_clBuildProgram clBuildProgram;
249 MAGICKpfn_clGetProgramInfo clGetProgramInfo;
250 MAGICKpfn_clGetProgramBuildInfo clGetProgramBuildInfo;
251 MAGICKpfn_clCreateKernel clCreateKernel;
252 MAGICKpfn_clReleaseKernel clReleaseKernel;
253 MAGICKpfn_clSetKernelArg clSetKernelArg;
254 MAGICKpfn_clFlush clFlush;
255 MAGICKpfn_clFinish clFinish;
256 MAGICKpfn_clEnqueueReadBuffer clEnqueueReadBuffer;
257 MAGICKpfn_clEnqueueWriteBuffer clEnqueueWriteBuffer;
258 MAGICKpfn_clEnqueueMapBuffer clEnqueueMapBuffer;
259 MAGICKpfn_clEnqueueUnmapMemObject clEnqueueUnmapMemObject;
260 MAGICKpfn_clEnqueueNDRangeKernel clEnqueueNDRangeKernel;
267 MagickLibrary * library;
270 cl_platform_id platform;
281 unsigned int numGenerators;
291 #if defined(MAGICKCORE_HDRI_SUPPORT)
292 #define CLOptions "-cl-single-precision-constant -cl-mad-enable -DMAGICKCORE_HDRI_SUPPORT=1 "\
293 "-DCLQuantum=float -DCLSignedQuantum=float -DCLPixelType=float4 -DQuantumRange=%f " \
294 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
295 " -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
296 #define CLPixelPacket cl_float4
297 #define CLCharQuantumScale 1.0f
298 #elif (MAGICKCORE_QUANTUM_DEPTH == 8)
299 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
300 "-DCLQuantum=uchar -DCLSignedQuantum=char -DCLPixelType=uchar4 -DQuantumRange=%ff " \
301 "-DQuantumScale=%ff -DCharQuantumScale=%ff -DMagickEpsilon=%ff -DMagickPI=%ff "\
302 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
303 #define CLPixelPacket cl_uchar4
304 #define CLCharQuantumScale 1.0f
305 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
306 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
307 "-DCLQuantum=ushort -DCLSignedQuantum=short -DCLPixelType=ushort4 -DQuantumRange=%f "\
308 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
309 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
310 #define CLPixelPacket cl_ushort4
311 #define CLCharQuantumScale 257.0f
312 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
313 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
314 "-DCLQuantum=uint -DCLSignedQuantum=int -DCLPixelType=uint4 -DQuantumRange=%f "\
315 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
316 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
317 #define CLPixelPacket cl_uint4
318 #define CLCharQuantumScale 16843009.0f
319 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
320 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
321 "-DCLQuantum=ulong -DCLSignedQuantum=long -DCLPixelType=ulong4 -DQuantumRange=%f "\
322 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
323 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
324 #define CLPixelPacket cl_ulong4
325 #define CLCharQuantumScale 72340172838076673.0f
339 const char *,
const char *,
const size_t,
379 const unsigned int line,
381 #ifdef OPENCLLOG_ENABLED
397 #if defined(__cplusplus) || defined(c_plusplus)
Definition: opencl-private.h:364
struct _AccelerateTimer AccelerateTimer
long long _freq
Definition: opencl-private.h:365
MagickPrivate cl_command_queue AcquireOpenCLCommandQueue(MagickCLEnv)
Definition: exception.h:102
void stopAccelerateTimer(AccelerateTimer *timer)
Definition: opencl.c:2901
MagickBooleanType OpenCLInitialized
Definition: opencl.c:2632
MagickPrivate MagickBooleanType RelinquishOpenCLCommandQueue(MagickCLEnv, cl_command_queue)
void * cl_command_queue
Definition: opencl-private.h:35
MagickPrivate unsigned long GetOpenCLDeviceMaxMemAllocSize(MagickCLEnv)
void * cl_device_id
Definition: opencl-private.h:33
MagickPrivate unsigned long GetOpenCLDeviceLocalMemorySize(MagickCLEnv)
ExceptionType
Definition: exception.h:28
void * cl_platform_id
Definition: opencl-private.h:32
MagickPrivate float GetRandNormalize(MagickCLEnv clEnv)
Definition: opencl.c:2796
long long _start
Definition: opencl-private.h:367
MagickBooleanType
Definition: magick-type.h:214
void * cl_kernel
Definition: opencl-private.h:36
char * reason
Definition: exception.h:111
MagickPrivate const char * GetOpenCLCachedFilesDirectory()
Definition: opencl.c:2808
void * cl_context
Definition: opencl-private.h:34
#define MaxTextExtent
Definition: method-attribute.h:106
MagickOpenCLProgram
Definition: opencl.h:27
double readAccelerateTimer(AccelerateTimer *timer)
Definition: opencl.c:2930
MagickPrivate cl_kernel AcquireOpenCLKernel(MagickCLEnv, MagickOpenCLProgram, const char *)
MagickPrivate void OpenCLLog(const char *)
Definition: opencl.c:2937
MagickPrivate MagickBooleanType OpenCLThrowMagickException(ExceptionInfo *, const char *, const char *, const size_t, const ExceptionType, const char *, const char *,...)
void initAccelerateTimer(AccelerateTimer *timer)
Definition: opencl.c:2921
MagickExport ssize_t FormatLocaleString(char *restrict string, const size_t length, const char *restrict format,...)
Definition: locale.c:475
MagickPrivate cl_context GetOpenCLContext(MagickCLEnv)
MagickPrivate void UnlockRandSeedBuffer(MagickCLEnv)
void * cl_mem
Definition: opencl-private.h:37
Definition: opencl-private.h:38
void resetAccelerateTimer(AccelerateTimer *timer)
Definition: opencl.c:2915
void startAccelerateTimer(AccelerateTimer *timer)
Definition: opencl.c:2889
#define magick_unreferenced(x)
Definition: method-attribute.h:123
MagickPrivate unsigned int GetNumRandGenerators(MagickCLEnv)
Definition: opencl.c:2790
long long _clocks
Definition: opencl-private.h:366
#define MagickPrivate
Definition: method-attribute.h:99
static void OpenCLLogException(const char *function, const unsigned int line, ExceptionInfo *exception)
Definition: opencl-private.h:378
MagickPrivate cl_mem GetAndLockRandSeedBuffer(MagickCLEnv)
Definition: opencl.c:2778
Definition: semaphore.c:58
Definition: opencl.c:2631
MagickPrivate MagickBooleanType RelinquishOpenCLKernel(MagickCLEnv, cl_kernel)
ExceptionType severity
Definition: exception.h:105