44#define DT_OPENCL_MAX_PLATFORMS 5
45#define DT_OPENCL_MAX_PROGRAMS 256
46#define DT_OPENCL_MAX_KERNELS 512
47#define DT_OPENCL_EVENTLISTSIZE 256
48#define DT_OPENCL_EVENTNAMELENGTH 64
49#define DT_OPENCL_MAX_ERRORS 5
50#define DT_OPENCL_MAX_INCLUDES 7
51#define DT_OPENCL_VENDOR_AMD 4098
52#define DT_OPENCL_VENDOR_NVIDIA 4318
53#define DT_OPENCL_VENDOR_INTEL 0x8086u
54#define DT_OPENCL_CBUFFSIZE 1024
57#define DT_OPENCL_DEFAULT_ERROR -999
58#define DT_OPENCL_SYSMEM_ALLOCATION -998
78#define ROUNDUP(a, n) ((a) % (n) == 0 ? (a) : ((a) / (n)+1) * (n))
81#define ROUNDUPDWD(a, b) dt_opencl_dev_roundup_width(a, b)
82#define ROUNDUPDHT(a, b) dt_opencl_dev_roundup_height(a, b)
84#define DT_OPENCL_BPP_TAG_RGBA8 (1u << 30)
85#define DT_OPENCL_BPP_ENCODE_RGBA8(bpp) ((int)((unsigned int)(bpp) | DT_OPENCL_BPP_TAG_RGBA8))
86#define DT_OPENCL_BPP_IS_RGBA8(bpp) ((((unsigned int)(bpp)) & DT_OPENCL_BPP_TAG_RGBA8) != 0u)
87#define DT_OPENCL_BPP_DECODE(bpp) ((int)(((unsigned int)(bpp)) & ~DT_OPENCL_BPP_TAG_RGBA8))
89#define DT_OPENCL_DEFAULT_COMPILE_INTEL ("-cl-fast-relaxed-math")
90#define DT_OPENCL_DEFAULT_COMPILE_AMD ("-cl-fast-relaxed-math")
91#define DT_OPENCL_DEFAULT_COMPILE_NVIDIA ("-cl-fast-relaxed-math")
92#define DT_OPENCL_DEFAULT_COMPILE ("-cl-fast-relaxed-math")
93#define DT_CLDEVICE_HEAD ("cldevice_v4")
95typedef enum dt_opencl_memory_t
104typedef struct dt_opencl_eventtag_t
109} dt_opencl_eventtag_t;
111typedef enum dt_opencl_pinmode_t
113 DT_OPENCL_PINNING_OFF = 0,
114 DT_OPENCL_PINNING_ON = 1,
115 DT_OPENCL_PINNING_DISABLED = 2
116} dt_opencl_pinmode_t;
122typedef struct dt_opencl_device_t
124 dt_pthread_mutex_t lock;
127 cl_command_queue cmd_queue;
128 size_t max_image_width;
129 size_t max_image_height;
130 cl_ulong max_mem_alloc;
131 cl_ulong max_global_mem;
132 cl_ulong used_global_mem;
138 dt_opencl_eventtag_t *eventtags;
140 int eventsconsolidated;
152 const char *options_md5;
154 size_t memory_in_use;
156 size_t used_available;
204 size_t forced_headroom;
207struct dt_bilateral_cl_global_t;
208struct dt_local_laplacian_cl_global_t;
209struct dt_dwt_cl_global_t;
210struct dt_heal_cl_global_t;
211struct dt_colorspaces_cl_global_t;
212struct dt_guided_filter_cl_global_t;
220 dt_pthread_mutex_t lock;
222 int print_statistics;
227 int opencl_synchronization_timeout;
230 int *dev_priority_image;
231 int *dev_priority_preview;
232 int *dev_priority_export;
233 int *dev_priority_thumbnail;
234 dt_opencl_device_t *dev;
235 dt_dlopencl_t *dlocl;
241 struct dt_bilateral_cl_global_t *bilateral;
244 struct dt_gaussian_cl_global_t *
gaussian;
247 struct dt_interpolation_cl_global_t *interpolation;
253 struct dt_dwt_cl_global_t *dwt;
256 struct dt_heal_cl_global_t *heal;
259 struct dt_colorspaces_cl_global_t *colorspaces;
268typedef struct dt_opencl_local_buffer_t
274 const size_t cellsize;
275 const size_t overhead;
278} dt_opencl_local_buffer_t;
283int dt_opencl_get_device_info(
dt_opencl_t *cl, cl_device_id device, cl_device_info param_name,
void **param_value,
284 size_t *param_value_size);
309void dt_opencl_md5sum(
const char **files,
char **md5sums);
313 const char *cachedir,
char *md5sum,
char **includemd5,
int *loaded_cached);
317 char *md5sum,
int loaded_cached);
330 unsigned long *localmemsize);
344 const size_t *local);
359int dt_opencl_copy_device_to_host(
const int devid,
void *host,
void *device,
const int width,
362int dt_opencl_read_host_from_device(
const int devid,
void *host,
void *device,
const int width,
365int dt_opencl_read_host_from_device_rowpitch(
const int devid,
void *host,
void *device,
const int width,
366 const int height,
const int rowpitch);
368int dt_opencl_read_host_from_device_non_blocking(
const int devid,
void *host,
void *device,
const int width,
371int dt_opencl_read_host_from_device_rowpitch_non_blocking(
const int devid,
void *host,
void *device,
375int dt_opencl_read_host_from_device_raw(
const int devid,
void *host,
void *device,
const size_t *origin,
376 const size_t *region,
const int rowpitch,
const int blocking);
378int dt_opencl_write_host_to_device(
const int devid,
void *host,
void *device,
const int width,
381int dt_opencl_write_host_to_device_rowpitch(
const int devid,
void *host,
void *device,
const int width,
382 const int height,
const int rowpitch);
384int dt_opencl_write_host_to_device_non_blocking(
const int devid,
void *host,
void *device,
const int width,
387int dt_opencl_write_host_to_device_rowpitch_non_blocking(
const int devid,
void *host,
void *device,
391int dt_opencl_write_host_to_device_raw(
const int devid,
void *host,
void *device,
const size_t *origin,
392 const size_t *region,
const int rowpitch,
const int blocking);
394void *dt_opencl_copy_host_to_device(
const int devid,
void *host,
const int width,
const int height,
397void *dt_opencl_copy_host_to_device_rowpitch(
const int devid,
void *host,
const int width,
const int height,
398 const int bpp,
const int rowpitch);
400void *dt_opencl_copy_host_to_device_constant(
const int devid,
const size_t size,
void *host);
402int dt_opencl_enqueue_copy_image(
const int devid, cl_mem src, cl_mem dst,
size_t *orig_src,
size_t *orig_dst,
405void *dt_opencl_alloc_device(
const int devid,
const int width,
const int height,
const int bpp);
407void *dt_opencl_alloc_device_use_host_pointer(
const int devid,
const int width,
const int height,
408 const int bpp,
void *host,
const int flags);
410int dt_opencl_enqueue_copy_image_to_buffer(
const int devid, cl_mem src_image, cl_mem dst_buffer,
411 size_t *origin,
size_t *region,
size_t offset);
413int dt_opencl_enqueue_copy_buffer_to_image(
const int devid, cl_mem src_buffer, cl_mem dst_image,
414 size_t offset,
size_t *origin,
size_t *region);
416int dt_opencl_enqueue_copy_buffer_to_buffer(
const int devid, cl_mem src_buffer, cl_mem dst_buffer,
417 size_t srcoffset,
size_t dstoffset,
size_t size);
419int dt_opencl_read_buffer_from_device(
const int devid,
void *host,
void *device,
const size_t offset,
420 const size_t size,
const int blocking);
422int dt_opencl_write_buffer_to_device(
const int devid,
void *host,
void *device,
const size_t offset,
423 const size_t size,
const int blocking);
425void *dt_opencl_alloc_device_buffer(
const int devid,
const size_t size);
427void *dt_opencl_alloc_device_buffer_with_flags(
const int devid,
const size_t size,
const int flags);
431void *dt_opencl_map_buffer(
const int devid, cl_mem buffer,
const int blocking,
const int flags,
size_t offset,
434void *dt_opencl_map_image(
const int devid, cl_mem buffer,
const int blocking,
const int flags,
size_t width,
size_t height,
int bpp);
436int dt_opencl_unmap_mem_object(
const int devid, cl_mem mem_object,
void *mapped_ptr);
438size_t dt_opencl_get_mem_object_size(cl_mem mem);
440int dt_opencl_get_image_width(cl_mem mem);
442int dt_opencl_get_image_height(cl_mem mem);
444int dt_opencl_get_image_element_size(cl_mem mem);
446int dt_opencl_get_mem_context_id(cl_mem mem);
449void dt_opencl_memory_statistics(
int devid, cl_mem mem, dt_opencl_memory_t action);
453 const float factor,
const size_t overhead);
464int dt_opencl_dev_roundup_width(
int size,
const int devid);
465int dt_opencl_dev_roundup_height(
int size,
const int devid);
485int dt_opencl_local_buffer_opt(
const int devid,
const int kernel, dt_opencl_local_buffer_t *
factors);
488void dt_opencl_write_device_config(
const int devid);
489gboolean dt_opencl_read_device_config(
const int devid);
490int dt_opencl_avoid_atomics(
const int devid);
491int dt_opencl_micro_nap(
const int devid);
492gboolean dt_opencl_use_pinned_memory(
const int devid);
561 unsigned long *localmemsize)
566 size_t *kernelworkgroupsize)
599 const unsigned bpp,
const float factor,
const size_t overhead)
#define FALSE
Definition ashift_lsd.c:158
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
static float kernel(const float *x, const float *y)
Definition colorchecker.c:469
const float i
Definition colorspaces_inline_conversions.h:669
const float factors[2]
Definition colorspaces_inline_conversions.h:1579
void dt_conf_set_bool(const char *name, int val)
Definition control/conf.c:158
void reset(dt_view_t *self)
Definition darkroom.c:1102
void dt_print(dt_debug_thread_t thread, const char *msg,...)
Definition darktable.c:1530
@ DT_DEBUG_OPENCL
Definition darktable.h:642
static float gaussian(float x, float std)
Definition filmic.c:401
int 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:360
int 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:69
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:574
static int dt_opencl_is_enabled(void)
Definition opencl.h:587
static unsigned long dt_opencl_get_mem_flags(void *mem)
Definition opencl.h:615
static int dt_opencl_get_kernel_work_group_size(const int dev, const int kernel, size_t *kernelworkgroupsize)
Definition opencl.h:565
static size_t dt_opencl_get_device_available(const int devid)
Definition opencl.h:603
static int dt_opencl_set_kernel_arg(const int dev, const int kernel, const size_t size, const void *arg)
Definition opencl.h:570
static void dt_opencl_events_profiling(const int devid, const int aggregated)
Definition opencl.h:636
static size_t dt_opencl_get_device_memalloc(const int devid)
Definition opencl.h:611
static void * dt_opencl_events_get_slot(const int devid, const char *tag)
Definition opencl.h:622
static int dt_opencl_create_kernel(const int program, const char *name)
Definition opencl.h:549
static int dt_opencl_build_program(const int dev, const int program)
Definition opencl.h:545
static void dt_opencl_events_reset(const int devid)
Definition opencl.h:626
static void dt_opencl_unlock_device(const int dev)
Definition opencl.h:538
static int dt_opencl_update_settings(void)
Definition opencl.h:594
static void dt_opencl_check_tuning(const int devid)
Definition opencl.h:607
static int dt_opencl_is_inited(void)
Definition opencl.h:583
static int dt_opencl_lock_device(const int dev)
Definition opencl.h:534
static int dt_opencl_events_flush(const int devid, const int reset)
Definition opencl.h:632
static int dt_opencl_get_max_work_item_sizes(const int dev, size_t *sizes)
Definition opencl.h:556
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:598
static gboolean dt_opencl_finish(const int devid)
Definition opencl.h:526
#define DT_OPENCL_EVENTNAMELENGTH
Definition opencl.h:48
static void dt_opencl_free_kernel(const int kernel)
Definition opencl.h:553
static int dt_opencl_enqueue_barrier(const int devid)
Definition opencl.h:530
static int dt_opencl_get_work_group_limits(const int dev, size_t *sizes, size_t *workgroupsize, unsigned long *localmemsize)
Definition opencl.h:560
static void dt_opencl_release_mem_object(void *mem)
Definition opencl.h:619
#define DT_OPENCL_MAX_PROGRAMS
Definition opencl.h:45
static void dt_opencl_init(dt_opencl_t *cl, const gboolean exclude_opencl, const gboolean print_statistics)
Definition opencl.h:514
static void dt_opencl_disable(void)
Definition opencl.h:591
static void dt_opencl_events_wait_for(const int devid)
Definition opencl.h:629
static int dt_opencl_load_program(const int dev, const char *filename)
Definition opencl.h:541
static void dt_opencl_cleanup(dt_opencl_t *cl)
Definition opencl.h:523
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:578
#define DT_OPENCL_MAX_KERNELS
Definition opencl.h:46
const float factor
Definition pdf.h:90
int error_count
Definition opencl.h:512
int stopped
Definition opencl.h:511
int enabled
Definition opencl.h:510
int inited
Definition opencl.h:509
Definition ansel-curve-tool.c:523