25#define DT_OPENCL_MAX_PLATFORMS 5
26#define DT_OPENCL_MAX_PROGRAMS 256
27#define DT_OPENCL_MAX_KERNELS 512
28#define DT_OPENCL_EVENTLISTSIZE 256
29#define DT_OPENCL_EVENTNAMELENGTH 64
30#define DT_OPENCL_MAX_ERRORS 5
31#define DT_OPENCL_MAX_INCLUDES 7
32#define DT_OPENCL_VENDOR_AMD 4098
33#define DT_OPENCL_VENDOR_NVIDIA 4318
34#define DT_OPENCL_VENDOR_INTEL 0x8086u
35#define DT_OPENCL_CBUFFSIZE 1024
38#define DT_OPENCL_DEFAULT_ERROR -999
39#define DT_OPENCL_SYSMEM_ALLOCATION -998
59#define ROUNDUP(a, n) ((a) % (n) == 0 ? (a) : ((a) / (n)+1) * (n))
62#define ROUNDUPDWD(a, b) dt_opencl_dev_roundup_width(a, b)
63#define ROUNDUPDHT(a, b) dt_opencl_dev_roundup_height(a, b)
65#define DT_OPENCL_DEFAULT_COMPILE_INTEL ("-cl-fast-relaxed-math")
66#define DT_OPENCL_DEFAULT_COMPILE_AMD ("-cl-fast-relaxed-math")
67#define DT_OPENCL_DEFAULT_COMPILE_NVIDIA ("-cl-fast-relaxed-math")
68#define DT_OPENCL_DEFAULT_COMPILE ("-cl-fast-relaxed-math")
69#define DT_CLDEVICE_HEAD ("cldevice_v4_")
71typedef enum dt_opencl_memory_t
80typedef struct dt_opencl_eventtag_t
85} dt_opencl_eventtag_t;
87typedef enum dt_opencl_pinmode_t
89 DT_OPENCL_PINNING_OFF = 0,
90 DT_OPENCL_PINNING_ON = 1,
91 DT_OPENCL_PINNING_DISABLED = 2
98typedef struct dt_opencl_device_t
100 dt_pthread_mutex_t lock;
103 cl_command_queue cmd_queue;
104 size_t max_image_width;
105 size_t max_image_height;
106 cl_ulong max_mem_alloc;
107 cl_ulong max_global_mem;
108 cl_ulong used_global_mem;
114 dt_opencl_eventtag_t *eventtags;
116 int eventsconsolidated;
131 size_t memory_in_use;
133 size_t used_available;
181 size_t forced_headroom;
184struct dt_bilateral_cl_global_t;
185struct dt_local_laplacian_cl_global_t;
186struct dt_dwt_cl_global_t;
187struct dt_heal_cl_global_t;
188struct dt_colorspaces_cl_global_t;
189struct dt_guided_filter_cl_global_t;
197 dt_pthread_mutex_t lock;
199 int print_statistics;
204 int opencl_synchronization_timeout;
207 int *dev_priority_image;
208 int *dev_priority_preview;
209 int *dev_priority_export;
210 int *dev_priority_thumbnail;
211 dt_opencl_device_t *dev;
212 dt_dlopencl_t *dlocl;
218 char progress_label[256];
228 struct dt_bilateral_cl_global_t *bilateral;
231 struct dt_gaussian_cl_global_t *
gaussian;
234 struct dt_interpolation_cl_global_t *interpolation;
240 struct dt_dwt_cl_global_t *dwt;
243 struct dt_heal_cl_global_t *heal;
246 struct dt_colorspaces_cl_global_t *colorspaces;
255typedef struct dt_opencl_local_buffer_t
261 const size_t cellsize;
262 const size_t overhead;
265} dt_opencl_local_buffer_t;
270int dt_opencl_get_device_info(
dt_opencl_t *cl, cl_device_id device, cl_device_info param_name,
void **param_value,
271 size_t *param_value_size);
280void dt_opencl_cleanup_device(
dt_opencl_t *cl,
int i);
296void dt_opencl_md5sum(
const char **files,
char **md5sums);
300 const char *cachedir,
char *md5sum,
char **includemd5,
int *loaded_cached);
304 char *md5sum,
int loaded_cached);
317 unsigned long *localmemsize);
331 const size_t *local);
346int dt_opencl_copy_device_to_host(
const int devid,
void *host,
void *device,
const int width,
349int dt_opencl_read_host_from_device(
const int devid,
void *host,
void *device,
const int width,
352int dt_opencl_read_host_from_device_rowpitch(
const int devid,
void *host,
void *device,
const int width,
353 const int height,
const int rowpitch);
355int dt_opencl_read_host_from_device_non_blocking(
const int devid,
void *host,
void *device,
const int width,
358int dt_opencl_read_host_from_device_rowpitch_non_blocking(
const int devid,
void *host,
void *device,
362int dt_opencl_read_host_from_device_raw(
const int devid,
void *host,
void *device,
const size_t *origin,
363 const size_t *region,
const int rowpitch,
const int blocking);
365int dt_opencl_write_host_to_device(
const int devid,
void *host,
void *device,
const int width,
368int dt_opencl_write_host_to_device_rowpitch(
const int devid,
void *host,
void *device,
const int width,
369 const int height,
const int rowpitch);
371int dt_opencl_write_host_to_device_non_blocking(
const int devid,
void *host,
void *device,
const int width,
374int dt_opencl_write_host_to_device_rowpitch_non_blocking(
const int devid,
void *host,
void *device,
378int dt_opencl_write_host_to_device_raw(
const int devid,
void *host,
void *device,
const size_t *origin,
379 const size_t *region,
const int rowpitch,
const int blocking);
381void *dt_opencl_copy_host_to_device(
const int devid,
void *host,
const int width,
const int height,
384void *dt_opencl_copy_host_to_device_rowpitch(
const int devid,
void *host,
const int width,
const int height,
385 const int bpp,
const int rowpitch);
387void *dt_opencl_copy_host_to_device_constant(
const int devid,
const size_t size,
void *host);
389int dt_opencl_enqueue_copy_image(
const int devid, cl_mem src, cl_mem dst,
size_t *orig_src,
size_t *orig_dst,
392void *dt_opencl_alloc_device(
const int devid,
const int width,
const int height,
const int bpp);
394void *dt_opencl_alloc_device_use_host_pointer(
const int devid,
const int width,
const int height,
395 const int bpp,
void *host,
const int flags);
397int dt_opencl_enqueue_copy_image_to_buffer(
const int devid, cl_mem src_image, cl_mem dst_buffer,
398 size_t *origin,
size_t *region,
size_t offset);
400int dt_opencl_enqueue_copy_buffer_to_image(
const int devid, cl_mem src_buffer, cl_mem dst_image,
401 size_t offset,
size_t *origin,
size_t *region);
403int dt_opencl_enqueue_copy_buffer_to_buffer(
const int devid, cl_mem src_buffer, cl_mem dst_buffer,
404 size_t srcoffset,
size_t dstoffset,
size_t size);
406int dt_opencl_read_buffer_from_device(
const int devid,
void *host,
void *device,
const size_t offset,
407 const size_t size,
const int blocking);
409int dt_opencl_write_buffer_to_device(
const int devid,
void *host,
void *device,
const size_t offset,
410 const size_t size,
const int blocking);
412void *dt_opencl_alloc_device_buffer(
const int devid,
const size_t size);
414void *dt_opencl_alloc_device_buffer_with_flags(
const int devid,
const size_t size,
const int flags);
418void *dt_opencl_map_buffer(
const int devid, cl_mem buffer,
const int blocking,
const int flags,
size_t offset,
421void *dt_opencl_map_image(
const int devid, cl_mem buffer,
const int blocking,
const int flags,
size_t width,
size_t height,
int bpp);
423int dt_opencl_unmap_mem_object(
const int devid, cl_mem mem_object,
void *mapped_ptr);
425size_t dt_opencl_get_mem_object_size(cl_mem mem);
427int dt_opencl_get_image_width(cl_mem mem);
429int dt_opencl_get_image_height(cl_mem mem);
431int dt_opencl_get_image_element_size(cl_mem mem);
433int dt_opencl_get_mem_context_id(cl_mem mem);
435void dt_opencl_memory_statistics(
int devid, cl_mem mem, dt_opencl_memory_t action);
439 const float factor,
const size_t overhead);
450int dt_opencl_dev_roundup_width(
int size,
const int devid);
451int dt_opencl_dev_roundup_height(
int size,
const int devid);
471int dt_opencl_local_buffer_opt(
const int devid,
const int kernel, dt_opencl_local_buffer_t *factors);
474void dt_opencl_write_device_config(
const int devid);
475gboolean dt_opencl_read_device_config(
const int devid);
476int dt_opencl_avoid_atomics(
const int devid);
477int dt_opencl_micro_nap(
const int devid);
478gboolean dt_opencl_use_pinned_memory(
const int devid);
547 unsigned long *localmemsize)
552 size_t *kernelworkgroupsize)
585 const unsigned bpp,
const float factor,
const size_t overhead)
#define FALSE
Definition ashift_lsd.c:147
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
static float kernel(const float *x, const float *y)
Definition colorchecker.c:435
void dt_conf_set_bool(const char *name, int val)
Definition conf.c:125
void reset(dt_view_t *self)
Definition darkroom.c:545
void dt_print(dt_debug_thread_t thread, const char *msg,...)
Definition darktable.c:1395
@ DT_DEBUG_OPENCL
Definition darktable.h:478
static float gaussian(float x, float std)
Definition filmic.c:374
void guided_filter(const float *const guide, const float *const in, float *const out, const int width, const int height, const int ch, const int w, const float sqrt_eps, const float guide_weight, const float min, const float max)
Definition guided_filter.c:309
void local_laplacian(const float *const input, float *const out, const int wd, const int ht, const float sigma, const float shadows, const float highlights, const float clarity, local_laplacian_boundary_t *b)
Definition locallaplacian.h:63
size_t size
Definition mipmap_cache.c:3
dt_mipmap_buffer_dsc_flags flags
Definition mipmap_cache.c:4
static int dt_opencl_enqueue_kernel_2d(const int dev, const int kernel, const size_t *sizes)
Definition opencl.h:560
static int dt_opencl_is_enabled(void)
Definition opencl.h:573
static int dt_opencl_get_kernel_work_group_size(const int dev, const int kernel, size_t *kernelworkgroupsize)
Definition opencl.h:551
static size_t dt_opencl_get_device_available(const int devid)
Definition opencl.h:589
static int dt_opencl_set_kernel_arg(const int dev, const int kernel, const size_t size, const void *arg)
Definition opencl.h:556
static void dt_opencl_events_profiling(const int devid, const int aggregated)
Definition opencl.h:618
static size_t dt_opencl_get_device_memalloc(const int devid)
Definition opencl.h:597
static void * dt_opencl_events_get_slot(const int devid, const char *tag)
Definition opencl.h:604
static int dt_opencl_create_kernel(const int program, const char *name)
Definition opencl.h:535
static int dt_opencl_build_program(const int dev, const int program)
Definition opencl.h:531
static void dt_opencl_events_reset(const int devid)
Definition opencl.h:608
static void dt_opencl_unlock_device(const int dev)
Definition opencl.h:524
static int dt_opencl_update_settings(void)
Definition opencl.h:580
static void dt_opencl_check_tuning(const int devid)
Definition opencl.h:593
static int dt_opencl_is_inited(void)
Definition opencl.h:569
static int dt_opencl_lock_device(const int dev)
Definition opencl.h:520
static int dt_opencl_events_flush(const int devid, const int reset)
Definition opencl.h:614
static int dt_opencl_get_max_work_item_sizes(const int dev, size_t *sizes)
Definition opencl.h:542
static gboolean dt_opencl_image_fits_device(const int devid, const size_t width, const size_t height, const unsigned bpp, const float factor, const size_t overhead)
Definition opencl.h:584
static gboolean dt_opencl_finish(const int devid)
Definition opencl.h:512
#define DT_OPENCL_EVENTNAMELENGTH
Definition opencl.h:29
static void dt_opencl_free_kernel(const int kernel)
Definition opencl.h:539
static int dt_opencl_enqueue_barrier(const int devid)
Definition opencl.h:516
static int dt_opencl_get_work_group_limits(const int dev, size_t *sizes, size_t *workgroupsize, unsigned long *localmemsize)
Definition opencl.h:546
static void dt_opencl_release_mem_object(void *mem)
Definition opencl.h:601
#define DT_OPENCL_MAX_PROGRAMS
Definition opencl.h:26
static void dt_opencl_init(dt_opencl_t *cl, const gboolean exclude_opencl, const gboolean print_statistics)
Definition opencl.h:500
static void dt_opencl_disable(void)
Definition opencl.h:577
static void dt_opencl_events_wait_for(const int devid)
Definition opencl.h:611
static int dt_opencl_load_program(const int dev, const char *filename)
Definition opencl.h:527
static void dt_opencl_cleanup(dt_opencl_t *cl)
Definition opencl.h:509
static int dt_opencl_enqueue_kernel_2d_with_local(const int dev, const int kernel, const size_t *sizes, const size_t *local)
Definition opencl.h:564
#define DT_OPENCL_MAX_KERNELS
Definition opencl.h:27
const float factor
Definition pdf.h:85
int error_count
Definition opencl.h:498
int stopped
Definition opencl.h:497
int enabled
Definition opencl.h:496
int inited
Definition opencl.h:495
Definition ansel-curve-tool.c:515