00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef MAGICKCORE_OPENCL_PRIVATE_H
00019 #define MAGICKCORE_OPENCL_PRIVATE_H
00020
00021
00022
00023
00024 #include "magick/studio.h"
00025 #include "magick/opencl.h"
00026
00027 #if defined(__cplusplus) || defined(c_plusplus)
00028 extern "C" {
00029 #endif
00030
00031 #if !defined(MAGICKCORE_OPENCL_SUPPORT)
00032 typedef void* cl_event;
00033 typedef void* cl_mem;
00034 typedef void* cl_uint;
00035 #else
00036
00037 #define MAX_COMMAND_QUEUES 16
00038
00039
00040
00041
00042
00043
00044
00045
00046 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformIDs)(
00047 cl_uint num_entries,
00048 cl_platform_id * platforms,
00049 cl_uint * num_platforms) CL_API_SUFFIX__VERSION_1_0;
00050
00051 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformInfo)(
00052 cl_platform_id platform,
00053 cl_platform_info param_name,
00054 size_t param_value_size,
00055 void * param_value,
00056 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00057
00058
00059 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceIDs)(
00060 cl_platform_id platform,
00061 cl_device_type device_type,
00062 cl_uint num_entries,
00063 cl_device_id * devices,
00064 cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0;
00065
00066 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceInfo)(
00067 cl_device_id device,
00068 cl_device_info param_name,
00069 size_t param_value_size,
00070 void * param_value,
00071 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00072
00073
00074 typedef CL_API_ENTRY cl_context (CL_API_CALL *MAGICKpfn_clCreateContext)(
00075 const cl_context_properties * properties,
00076 cl_uint num_devices,
00077 const cl_device_id * devices,
00078 void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *),
00079 void * user_data,
00080 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00081
00082 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseContext)(
00083 cl_context context) CL_API_SUFFIX__VERSION_1_0;
00084
00085
00086 typedef CL_API_ENTRY cl_command_queue (CL_API_CALL *MAGICKpfn_clCreateCommandQueue)(
00087 cl_context context,
00088 cl_device_id device,
00089 cl_command_queue_properties properties,
00090 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00091
00092 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
00093 cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
00094
00095
00096 typedef CL_API_ENTRY cl_mem (CL_API_CALL *MAGICKpfn_clCreateBuffer)(
00097 cl_context context,
00098 cl_mem_flags flags,
00099 size_t size,
00100 void * host_ptr,
00101 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00102
00103 typedef CL_API_ENTRY cl_int
00104 (CL_API_CALL *MAGICKpfn_clRetainMemObject)(cl_mem memobj)
00105 CL_API_SUFFIX__VERSION_1_0;
00106
00107 typedef CL_API_ENTRY cl_int
00108 (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj)
00109 CL_API_SUFFIX__VERSION_1_0;
00110
00111
00112 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithSource)(
00113 cl_context context,
00114 cl_uint count,
00115 const char ** strings,
00116 const size_t * lengths,
00117 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00118
00119 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithBinary)(
00120 cl_context context,
00121 cl_uint num_devices,
00122 const cl_device_id * device_list,
00123 const size_t * lengths,
00124 const unsigned char ** binaries,
00125 cl_int * binary_status,
00126 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00127
00128 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
00129
00130 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clBuildProgram)(
00131 cl_program program,
00132 cl_uint num_devices,
00133 const cl_device_id * device_list,
00134 const char * options,
00135 void (CL_CALLBACK *pfn_notify)(cl_program program, void * user_data),
00136 void * user_data) CL_API_SUFFIX__VERSION_1_0;
00137
00138 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramInfo)(
00139 cl_program program,
00140 cl_program_info param_name,
00141 size_t param_value_size,
00142 void * param_value,
00143 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00144
00145 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramBuildInfo)(
00146 cl_program program,
00147 cl_device_id device,
00148 cl_program_build_info param_name,
00149 size_t param_value_size,
00150 void * param_value,
00151 size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00152
00153
00154 typedef CL_API_ENTRY cl_kernel (CL_API_CALL *MAGICKpfn_clCreateKernel)(
00155 cl_program program,
00156 const char * kernel_name,
00157 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00158
00159 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0;
00160
00161 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clSetKernelArg)(
00162 cl_kernel kernel,
00163 cl_uint arg_index,
00164 size_t arg_size,
00165 const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
00166
00167 typedef CL_API_ENTRY cl_int
00168 (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue)
00169 CL_API_SUFFIX__VERSION_1_0;
00170
00171 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFinish)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
00172
00173
00174 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueReadBuffer)(
00175 cl_command_queue command_queue,
00176 cl_mem buffer,
00177 cl_bool blocking_read,
00178 size_t offset,
00179 size_t cb,
00180 void * ptr,
00181 cl_uint num_events_in_wait_list,
00182 const cl_event * event_wait_list,
00183 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
00184
00185 typedef CL_API_ENTRY void * (CL_API_CALL *MAGICKpfn_clEnqueueMapBuffer)(
00186 cl_command_queue command_queue,
00187 cl_mem buffer,
00188 cl_bool blocking_map,
00189 cl_map_flags map_flags,
00190 size_t offset,
00191 size_t cb,
00192 cl_uint num_events_in_wait_list,
00193 const cl_event * event_wait_list,
00194 cl_event * event,
00195 cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00196
00197 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueUnmapMemObject)(
00198 cl_command_queue command_queue,
00199 cl_mem memobj,
00200 void * mapped_ptr,
00201 cl_uint num_events_in_wait_list,
00202 const cl_event * event_wait_list,
00203 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
00204
00205 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueNDRangeKernel)(
00206 cl_command_queue command_queue,
00207 cl_kernel kernel,
00208 cl_uint work_dim,
00209 const size_t * global_work_offset,
00210 const size_t * global_work_size,
00211 const size_t * local_work_size,
00212 cl_uint num_events_in_wait_list,
00213 const cl_event * event_wait_list,
00214 cl_event * event) CL_API_SUFFIX__VERSION_1_0;
00215
00216 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clGetEventProfilingInfo)(
00217 cl_event event,
00218 cl_profiling_info param_name,
00219 size_t param_value_size,
00220 void *param_value,
00221 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00222
00223 typedef CL_API_ENTRY cl_int
00224 (CL_API_CALL *MAGICKpfn_clGetEventInfo)(cl_event event,
00225 cl_profiling_info param_name,size_t param_value_size,void *param_value,
00226 size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00227
00228 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clWaitForEvents)(
00229 cl_uint num_events,
00230 const cl_event *event_list) CL_API_SUFFIX__VERSION_1_0;
00231
00232 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clReleaseEvent)(
00233 cl_event event) CL_API_SUFFIX__VERSION_1_0;
00234
00235 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clRetainEvent)(
00236 cl_event event) CL_API_SUFFIX__VERSION_1_0;
00237
00238 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clSetEventCallback)(
00239 cl_event event,cl_int command_exec_callback_type,
00240 void (CL_CALLBACK *MAGICKpfn_notify)(cl_event,cl_int,void *),
00241 void *user_data) CL_API_SUFFIX__VERSION_1_1;
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 typedef struct MagickLibraryRec MagickLibrary;
00253
00254 struct MagickLibraryRec
00255 {
00256 void * base;
00257
00258 MAGICKpfn_clGetPlatformIDs clGetPlatformIDs;
00259 MAGICKpfn_clGetPlatformInfo clGetPlatformInfo;
00260
00261 MAGICKpfn_clGetDeviceIDs clGetDeviceIDs;
00262 MAGICKpfn_clGetDeviceInfo clGetDeviceInfo;
00263
00264 MAGICKpfn_clCreateContext clCreateContext;
00265 MAGICKpfn_clReleaseContext clReleaseContext;
00266
00267 MAGICKpfn_clCreateCommandQueue clCreateCommandQueue;
00268 MAGICKpfn_clReleaseCommandQueue clReleaseCommandQueue;
00269 MAGICKpfn_clFlush clFlush;
00270 MAGICKpfn_clFinish clFinish;
00271
00272 MAGICKpfn_clCreateBuffer clCreateBuffer;
00273 MAGICKpfn_clRetainMemObject clRetainMemObject;
00274 MAGICKpfn_clReleaseMemObject clReleaseMemObject;
00275 MAGICKpfn_clCreateProgramWithSource clCreateProgramWithSource;
00276 MAGICKpfn_clCreateProgramWithBinary clCreateProgramWithBinary;
00277 MAGICKpfn_clReleaseProgram clReleaseProgram;
00278 MAGICKpfn_clBuildProgram clBuildProgram;
00279 MAGICKpfn_clGetProgramInfo clGetProgramInfo;
00280 MAGICKpfn_clGetProgramBuildInfo clGetProgramBuildInfo;
00281
00282 MAGICKpfn_clCreateKernel clCreateKernel;
00283 MAGICKpfn_clReleaseKernel clReleaseKernel;
00284 MAGICKpfn_clSetKernelArg clSetKernelArg;
00285
00286 MAGICKpfn_clEnqueueReadBuffer clEnqueueReadBuffer;
00287 MAGICKpfn_clEnqueueMapBuffer clEnqueueMapBuffer;
00288 MAGICKpfn_clEnqueueUnmapMemObject clEnqueueUnmapMemObject;
00289 MAGICKpfn_clEnqueueNDRangeKernel clEnqueueNDRangeKernel;
00290
00291 MAGICKpfn_clGetEventProfilingInfo clGetEventProfilingInfo;
00292
00293 MAGICKpfn_clGetEventInfo clGetEventInfo;
00294 MAGICKpfn_clWaitForEvents clWaitForEvents;
00295 MAGICKpfn_clReleaseEvent clReleaseEvent;
00296 MAGICKpfn_clRetainEvent clRetainEvent;
00297 MAGICKpfn_clSetEventCallback clSetEventCallback;
00298 };
00299
00300 struct _MagickCLEnv {
00301 MagickBooleanType OpenCLInitialized;
00302 MagickBooleanType OpenCLDisabled;
00303
00304 MagickLibrary * library;
00305
00306
00307 cl_platform_id platform;
00308 cl_device_type deviceType;
00309 cl_device_id device;
00310 cl_context context;
00311
00312 MagickBooleanType disableProgramCache;
00313 cl_program programs[MAGICK_OPENCL_NUM_PROGRAMS];
00314
00315 MagickBooleanType regenerateProfile;
00316
00317 SemaphoreInfo* lock;
00318
00319 cl_command_queue commandQueues[MAX_COMMAND_QUEUES];
00320 ssize_t commandQueuesPos;
00321 SemaphoreInfo* commandQueuesLock;
00322 };
00323
00324
00325 #if defined(MAGICKCORE_HDRI_SUPPORT)
00326 #define CLOptions "-cl-single-precision-constant -cl-mad-enable -DMAGICKCORE_HDRI_SUPPORT=1 "\
00327 "-DCLQuantum=float -DCLSignedQuantum=float -DCLPixelType=float4 -DQuantumRange=%f " \
00328 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
00329 " -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00330 #define CLPixelPacket cl_float4
00331 #define CLCharQuantumScale 1.0f
00332 #elif (MAGICKCORE_QUANTUM_DEPTH == 8)
00333 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
00334 "-DCLQuantum=uchar -DCLSignedQuantum=char -DCLPixelType=uchar4 -DQuantumRange=%ff " \
00335 "-DQuantumScale=%ff -DCharQuantumScale=%ff -DMagickEpsilon=%ff -DMagickPI=%ff "\
00336 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00337 #define CLPixelPacket cl_uchar4
00338 #define CLCharQuantumScale 1.0f
00339 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
00340 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
00341 "-DCLQuantum=ushort -DCLSignedQuantum=short -DCLPixelType=ushort4 -DQuantumRange=%f "\
00342 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
00343 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00344 #define CLPixelPacket cl_ushort4
00345 #define CLCharQuantumScale 257.0f
00346 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
00347 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
00348 "-DCLQuantum=uint -DCLSignedQuantum=int -DCLPixelType=uint4 -DQuantumRange=%f "\
00349 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
00350 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00351 #define CLPixelPacket cl_uint4
00352 #define CLCharQuantumScale 16843009.0f
00353 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
00354 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
00355 "-DCLQuantum=ulong -DCLSignedQuantum=long -DCLPixelType=ulong4 -DQuantumRange=%f "\
00356 "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
00357 "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00358 #define CLPixelPacket cl_ulong4
00359 #define CLCharQuantumScale 72340172838076673.0f
00360 #endif
00361
00362 typedef enum {
00363 AddNoiseKernel,
00364 BlurRowKernel,
00365 BlurColumnKernel,
00366 CompositeKernel,
00367 ComputeFunctionKernel,
00368 ContrastKernel,
00369 ContrastStretchKernel,
00370 ConvolveKernel,
00371 EqualizeKernel,
00372 GrayScaleKernel,
00373 HistogramKernel,
00374 HullPass1Kernel,
00375 HullPass2Kernel,
00376 LocalContrastBlurRowKernel,
00377 LocalContrastBlurApplyColumnKernel,
00378 ModulateKernel,
00379 MotionBlurKernel,
00380 RadialBlurKernel,
00381 RandomNumberGeneratorKernel,
00382 ResizeHorizontalKernel,
00383 ResizeVerticalKernel,
00384 UnsharpMaskBlurColumnKernel,
00385 UnsharpMaskKernel,
00386 WaveletDenoiseKernel,
00387 KERNEL_COUNT
00388 } ProfiledKernels;
00389
00390 extern MagickPrivate cl_context
00391 GetOpenCLContext(MagickCLEnv);
00392
00393 extern MagickPrivate cl_kernel
00394 AcquireOpenCLKernel(MagickCLEnv, MagickOpenCLProgram, const char*);
00395
00396 extern MagickPrivate cl_command_queue
00397 AcquireOpenCLCommandQueue(MagickCLEnv);
00398
00399 extern MagickPrivate MagickBooleanType
00400 OpenCLThrowMagickException(ExceptionInfo *,
00401 const char *,const char *,const size_t,
00402 const ExceptionType,const char *,const char *,...),
00403 RecordProfileData(MagickCLEnv,ProfiledKernels,cl_event),
00404 RelinquishMagickOpenCLEnv(MagickCLEnv),
00405 RelinquishOpenCLCommandQueue(MagickCLEnv, cl_command_queue),
00406 RelinquishOpenCLKernel(MagickCLEnv, cl_kernel);
00407
00408 extern MagickPrivate MagickCLEnv
00409 AcquireMagickOpenCLEnv(),
00410 SetDefaultOpenCLEnv(MagickCLEnv);
00411
00412 extern MagickPrivate unsigned long
00413 GetOpenCLDeviceLocalMemorySize(MagickCLEnv),
00414 GetOpenCLDeviceMaxMemAllocSize(MagickCLEnv);
00415
00416 extern MagickPrivate const char*
00417 GetOpenCLCachedFilesDirectory();
00418
00419 extern MagickPrivate void
00420 OpenCLLog(const char*),
00421 OpenCLTerminus();
00422
00423
00424 static inline void OpenCLLogException(const char* function,
00425 const unsigned int line,
00426 ExceptionInfo* exception) {
00427 #ifdef OPENCLLOG_ENABLED
00428 if (exception->severity!=0) {
00429 char message[MaxTextExtent];
00430
00431 (void) FormatLocaleString(message,MaxTextExtent,"%s:%d Exception(%d):%s "
00432 ,function,line,exception->severity,exception->reason);
00433 OpenCLLog(message);
00434 }
00435 #else
00436 magick_unreferenced(function);
00437 magick_unreferenced(line);
00438 magick_unreferenced(exception);
00439 #endif
00440 }
00441 #endif
00442
00443 #if defined(__cplusplus) || defined(c_plusplus)
00444 }
00445 #endif
00446
00447 #endif