22#if defined __DragonFly__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__
25#elif !defined _XOPEN_SOURCE && !defined _WIN32
26#define _XOPEN_SOURCE 700
30#define __STDC_FORMAT_MACROS
37#include "external/ThreadSafetyAnalysis.h"
48#include <sys/resource.h>
52#include <glib/gstdio.h>
53#include <glib/gi18n.h>
55#include <json-glib/json-glib.h>
77#define DT_MODULE_VERSION 23
82#define DT_CURRENT_PERFORMANCE_CONFIGURE_VERSION 11
83#define DT_PERF_INFOSIZE 4096
87#define DT_MODULE(MODVER) \
88 int dt_module_dt_version() \
90 return -DT_MODULE_VERSION; \
92 int dt_module_mod_version() \
97#define DT_MODULE(MODVER) \
98 int dt_module_dt_version() \
100 return DT_MODULE_VERSION; \
102 int dt_module_mod_version() \
108#define DT_MODULE_INTROSPECTION(MODVER, PARAMSTYPE) DT_MODULE(MODVER)
124#define STR_HELPER(x) #x
127#define STR(x) STR_HELPER(x)
129#define DT_IMAGE_DBLOCKS 64
135#define DT_RESTRICT restrict
139#define UNKNOWN_IMAGE -1
158#include <mach/mach.h>
159#include <sys/sysctl.h>
162#if defined(__DragonFly__) || defined(__FreeBSD__)
163typedef unsigned int u_int;
164#include <sys/sysctl.h>
165#include <sys/types.h>
167#if defined(__NetBSD__) || defined(__OpenBSD__)
168#include <sys/param.h>
169#include <sys/sysctl.h>
172#if defined(__aarch64__)
177#include <xmmintrin.h>
184# ifdef HAVE_OMP_FIRSTPRIVATE_WITH_CONST
186# define dt_omp_firstprivate(...) firstprivate(__VA_ARGS__)
189# define dt_omp_firstprivate(...)
192#ifndef dt_omp_sharedconst
194#if defined(__clang__) || __GNUC__ > 8
195# define dt_omp_sharedconst(...) shared(__VA_ARGS__)
199# define dt_omp_sharedconst(var, ...)
204#ifndef dt_omp_nontemporal
208#if (__clang__+0 >= 10 || __GNUC__ >= 9)
209# define dt_omp_nontemporal(...) nontemporal(__VA_ARGS__)
212# define dt_omp_nontemporal(var, ...)
218# define omp_get_max_threads() 1
219# define omp_get_thread_num() 0
239#if __has_attribute(target_clones) && !defined(_WIN32) && !defined(__APPLE__) && !defined(NATIVE_ARCH)
240 # if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)
241 #define __DT_CLONE_TARGETS__ __attribute__((target_clones("default", "sse2", "sse3", "sse4.1", "sse4.2", "popcnt", "avx", "avx2", "avx512f", "fma4")))
242 # elif defined(__PPC64__)
244 #define __DT_CLONE_TARGETS__ __attribute__((target_clones("default","cpu=power9")))
246 #define __DT_CLONE_TARGETS__
249 #define __DT_CLONE_TARGETS__
253#define DT_IS_ALIGNED(x) __builtin_assume_aligned(x, DT_CACHELINE_BYTES)
257#if defined(__APPLE__) && defined(__aarch64__)
258 #define DT_CACHELINE_BYTES 128
259 #define DT_CACHELINE_FLOATS 32
260 #define DT_CACHELINE_PIXELS 8
262 #define DT_CACHELINE_BYTES 64
263 #define DT_CACHELINE_FLOATS 16
264 #define DT_CACHELINE_PIXELS 4
270#define DT_ALIGNED_ARRAY __attribute__((aligned(DT_CACHELINE_BYTES)))
271#define DT_ALIGNED_PIXEL __attribute__((aligned(16)))
276 return (uintptr_t)pointer % byte_count == 0;
282 return ((
size % alignment) == 0) ?
size : ((
size - 1) / alignment + 1) * alignment;
295#if defined(__FreeBSD_version) && __FreeBSD_version < 700013
296 return malloc(aligned_size);
298 return _aligned_malloc(aligned_size, alignment);
303 if(posix_memalign(&ptr, alignment, aligned_size + alignment))
return NULL;
304 short *offset = (
short*)(((
char*)ptr) + alignment -
sizeof(short));
306 return ((
char*)ptr) + alignment ;
309 if(posix_memalign(&ptr, alignment, aligned_size))
return NULL;
321 #define dt_free_align_ptr dt_free_align
328 short offset = ((
short*)mem)[-1];
329 free(((
char*)mem)-offset);
332 #define dt_free_align_ptr dt_free_align
334 #define dt_free_align(A) if(A) free(A)
335 #define dt_free_align_ptr free
342 if(buf) memset(buf, 0,
size);
351 float *
const buf = (
float*)
dt_alloc_align(pixels *
sizeof(
float));
352 if(buf) memset(buf, 0, pixels *
sizeof(
float));
384#ifdef DT_NO_VECTORIZATION
385#define DT_PIXEL_SIMD_CHANNELS 3
387#define DT_PIXEL_SIMD_CHANNELS 4
400#if defined(_OPENMP) && defined(OPENMP_SIMD_) && !defined(DT_NO_SIMD_HINTS)
402#define _DT_Pragma_(x) _Pragma(#x)
403#define _DT_Pragma(x) _DT_Pragma_(x)
404#define for_each_channel(_var, ...) \
405 _DT_Pragma(omp simd __VA_ARGS__) \
406 for (size_t _var = 0; _var < DT_PIXEL_SIMD_CHANNELS; _var++)
407#define for_four_channels(_var, ...) \
408 _DT_Pragma(omp simd __VA_ARGS__) \
409 for (size_t _var = 0; _var < 4; _var++)
411#define for_each_channel(_var, ...) \
412 for (size_t _var = 0; _var < DT_PIXEL_SIMD_CHANNELS; _var++)
413#define for_four_channels(_var, ...) \
414 for (size_t _var = 0; _var < 4; _var++)
427 float *
const __restrict__ out,
428 const float *
const __restrict__ in)
431 _mm_stream_ps(out, *((__m128*)in));
432#elif defined(__aarch64__)
433 vst1q_f32(out, *((float32x4_t *)in));
434#elif (__clang__+0 > 7) && (__clang__+0 < 10)
435 for_each_channel(k,aligned(in,out:16)) __builtin_nontemporal_store(in[k],out[k]);
437 for_each_channel(k,aligned(in,out:16) dt_omp_nontemporal(out)) out[k] = in[k];
445static inline void copy_pixel(
float *
const __restrict__ out,
const float *
const __restrict__ in)
612int dt_init(
int argc,
char *argv[],
const gboolean init_gui,
const gboolean load_data,
lua_State *L);
657 for(
size_t k = 0; k <
size /
sizeof(
unsigned char); k++) {
658 unsigned char *
const item = (
unsigned char *
const)buffer + k;
665static inline gboolean
dt_modifier_is(
const GdkModifierType state,
const GdkModifierType desired_modifier_mask)
667 const GdkModifierType modifiers = gtk_accelerator_get_default_mod_mask();
669 return (state & modifiers) == desired_modifier_mask;
673static inline gboolean
dt_modifiers_include(
const GdkModifierType state,
const GdkModifierType desired_modifier_mask)
676 const GdkModifierType modifiers = gtk_accelerator_get_default_mod_mask();
678 return (state & (modifiers & desired_modifier_mask)) == desired_modifier_mask;
689 gettimeofday(&time, NULL);
690 return time.tv_sec - 1290608000 + (1.0 / 1000000.0) * time.tv_usec;
710#define g_list_is_singleton(list) ((list) && (!(list)->next))
717 if (!list)
return TRUE;
718 list = g_list_next(list);
726 return g_list_next(list) ? g_list_next(list) : list;
731 return g_list_next(list) ? g_list_next(list) : head;
738 return g_list_previous(list) ? g_list_previous(list) : g_list_last((GList*)list);
747int dt_load_from_string(
const gchar *image_to_load, gboolean open_image_in_dr, gboolean *single_image);
749#define dt_unreachable_codepath_with_desc(D) \
750 dt_unreachable_codepath_with_caller(D, __FILE__, __LINE__, __FUNCTION__)
751#define dt_unreachable_codepath() dt_unreachable_codepath_with_caller("unreachable", __FILE__, __LINE__, __FUNCTION__)
753 const int line,
const char *function)
755 fprintf(stderr,
"[dt_unreachable_codepath] {%s} %s:%d (%s) - we should not be here. please report this to "
758 __builtin_unreachable();
768 const size_t alloc_size = n * objsize;
797#define dt_get_perthread(buf, padsize) DT_IS_ALIGNED((buf) + ((padsize) * dt_get_thread_num()))
800#define dt_get_bythread(buf, padsize, tnum) DT_IS_ALIGNED((buf) + ((padsize) * (tnum)))
807 for(
size_t i = 0; i <
size; i++)
808 hash = ((hash << 5) + hash) ^ str[i];
814#define DT_MAX_FILENAME_LEN 256
833#define DT_MAX_PATH_FOR_PARAMS 4096
837 if(!
string || !to_replace)
return NULL;
838 gchar **split = g_strsplit(
string, to_replace, -1);
839 gchar *text = g_strjoinv(
"", split);
859 PangoAttrList *attrs = NULL;
862 const gchar *underscore =
"_";
863 gunichar mnemonic = underscore[0];
864 if(!pango_parse_markup(s, -1, mnemonic, &attrs, &plain, NULL, NULL))
867 pango_attr_list_unref(attrs);
const char ** description(struct dt_iop_module_t *self)
Definition ashift.c:129
#define TRUE
Definition ashift_lsd.c:151
#define FALSE
Definition ashift_lsd.c:147
#define DT_ALIGNED_PIXEL
Definition darktable.h:271
static void memset_zero(void *const buffer, size_t size)
Set the memory buffer to zero as a pack of unsigned char.
Definition darktable.h:653
void dt_show_times(const dt_times_t *start, const char *prefix)
Definition darktable.c:1433
static gchar * dt_string_replace(const char *string, const char *to_replace)
Definition darktable.h:835
static float * dt_calloc_align_float(size_t pixels)
Definition darktable.h:349
static void * dt_calloc_align(size_t size)
Definition darktable.h:339
static gboolean dt_modifiers_include(const GdkModifierType state, const GdkModifierType desired_modifier_mask)
Definition darktable.h:673
dt_debug_thread_t
Definition darktable.h:470
@ DT_DEBUG_LIGHTTABLE
Definition darktable.h:481
@ DT_DEBUG_UNDO
Definition darktable.h:490
@ DT_DEBUG_INPUT
Definition darktable.h:485
@ DT_DEBUG_PRINT
Definition darktable.h:486
@ DT_DEBUG_OPENCL
Definition darktable.h:478
@ DT_DEBUG_PIPE
Definition darktable.h:497
@ DT_DEBUG_HISTORY
Definition darktable.h:496
@ DT_DEBUG_CAMERA_SUPPORT
Definition darktable.h:487
@ DT_DEBUG_NAN
Definition darktable.h:482
@ DT_DEBUG_DEMOSAIC
Definition darktable.h:493
@ DT_DEBUG_MEMORY
Definition darktable.h:480
@ DT_DEBUG_PERF
Definition darktable.h:475
@ DT_DEBUG_VERBOSE
Definition darktable.h:499
@ DT_DEBUG_PARAMS
Definition darktable.h:492
@ DT_DEBUG_CONTROL
Definition darktable.h:473
@ DT_DEBUG_CACHE
Definition darktable.h:472
@ DT_DEBUG_SIGNAL
Definition darktable.h:491
@ DT_DEBUG_PWSTORAGE
Definition darktable.h:477
@ DT_DEBUG_SHORTCUTS
Definition darktable.h:494
@ DT_DEBUG_IMAGEIO
Definition darktable.h:489
@ DT_DEBUG_DEV
Definition darktable.h:474
@ DT_DEBUG_CAMCTL
Definition darktable.h:476
@ DT_DEBUG_IMPORT
Definition darktable.h:498
@ DT_DEBUG_IOPORDER
Definition darktable.h:488
@ DT_DEBUG_MASKS
Definition darktable.h:483
@ DT_DEBUG_TILING
Definition darktable.h:495
@ DT_DEBUG_SQL
Definition darktable.h:479
@ DT_DEBUG_LUA
Definition darktable.h:484
void dt_cleanup()
Definition darktable.c:1248
void gboolean dt_supported_image(const gchar *filename)
check if file is a supported image
Definition darktable.c:199
static void copy_pixel(float *const __restrict__ out, const float *const __restrict__ in)
Definition darktable.h:445
int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load_data, lua_State *L)
Definition darktable.c:389
#define for_each_channel(_var,...)
Definition darktable.h:411
float dt_boundingbox_t[4]
Definition darktable.h:467
static float * dt_alloc_align_float(size_t pixels)
Definition darktable.h:345
static size_t dt_round_size_sse(const size_t size)
Definition darktable.h:285
void void dt_print_nts(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
static void * dt_check_sse_aligned(void *pointer)
Definition darktable.h:361
static gchar * strip_markup(const char *s)
Remove Pango/Gtk markup and accels mnemonics from text labels. If the markup parsing fails,...
Definition darktable.h:857
darktable_t darktable
Definition darktable.c:111
static void * dt_alloc_align_internal(size_t size)
Definition darktable.h:291
void dt_print_mem_usage()
Definition darktable.c:1686
static void * dt_alloc_perthread(const size_t n, const size_t objsize, size_t *padded_size)
Definition darktable.h:766
static void copy_pixel_nontemporal(float *const __restrict__ out, const float *const __restrict__ in)
Definition darktable.h:426
void void void int dt_worker_threads()
Definition darktable.c:1530
static const GList * g_list_next_wraparound(const GList *list, const GList *head)
Definition darktable.h:729
static int dt_get_thread_num()
Definition darktable.h:227
size_t dt_get_singlebuffer_mem()
Definition darktable.c:1548
void dt_capabilities_remove(char *capability)
Definition darktable.c:1669
void dt_print(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
static void dt_get_times(dt_times_t *t)
Definition darktable.h:693
#define omp_get_thread_num()
Definition darktable.h:219
static const GList * g_list_prev_wraparound(const GList *list)
Definition darktable.h:734
void void void dt_vprint(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
static float * dt_calloc_perthread_float(const size_t n, size_t *padded_size)
Definition darktable.h:785
static int dt_version()
Definition darktable.h:111
static gchar * delete_underscore(const char *s)
Definition darktable.h:845
static uint64_t dt_hash(uint64_t hash, const char *str, size_t size)
Definition darktable.h:805
size_t dt_get_mipmap_mem()
Definition darktable.c:1553
static size_t dt_round_size(const size_t size, const size_t alignment)
Definition darktable.h:279
static void dt_unreachable_codepath_with_caller(const char *description, const char *file, const int line, const char *function)
Definition darktable.h:752
int dt_load_from_string(const gchar *image_to_load, gboolean open_image_in_dr, gboolean *single_image)
Definition darktable.c:215
#define DT_MODULE_VERSION
Definition darktable.h:77
static GList * g_list_next_bounded(GList *list)
Definition darktable.h:724
char * dt_version_major_minor()
Definition darktable.c:168
void dt_configure_runtime_performance(dt_sys_resources_t *resources, gboolean init_gui)
Definition darktable.c:1558
#define dt_free_align(A)
Definition darktable.h:334
void dt_capabilities_add(char *capability)
Definition darktable.c:1658
static double dt_get_wtime(void)
Definition darktable.h:686
void dt_capabilities_cleanup()
Definition darktable.c:1679
static gboolean dt_is_aligned(const void *pointer, size_t byte_count)
Definition darktable.h:274
typedef __attribute__((aligned(16))) float dt_aligned_pixel_t[4]
static gboolean dt_modifier_is(const GdkModifierType state, const GdkModifierType desired_modifier_mask)
Definition darktable.h:665
void dt_show_times_f(const dt_times_t *start, const char *prefix, const char *suffix,...) __attribute__((format(printf
size_t dt_get_available_mem()
Definition darktable.c:1535
int dt_capabilities_check(char *capability)
Definition darktable.c:1645
static float * dt_alloc_perthread_float(const size_t n, size_t *padded_size)
Definition darktable.h:780
static void * dt_calloc_perthread(const size_t n, const size_t objsize, size_t *padded_size)
Definition darktable.h:773
static void * dt_alloc_sse_ps(size_t pixels)
Definition darktable.h:356
#define DT_CACHELINE_BYTES
Definition darktable.h:262
static gboolean g_list_shorter_than(const GList *list, unsigned len)
Definition darktable.h:711
#define dt_pthread_rwlock_t
Definition dtpthread.h:336
int getrusage(int who, struct rusage *usage)
Definition getrusage.c:53
#define RUSAGE_SELF
Definition getrusage.h:50
int lua_State
Definition lua.h:90
size_t size
Definition mipmap_cache.c:3
@ DT_SIGNAL_COUNT
Definition signal.h:250
unsigned __int64 uint64_t
Definition strptime.c:71
Definition darktable.h:522
struct dt_dbus_t * dbus
Definition darktable.h:552
struct dt_undo_t * undo
Definition darktable.h:553
char * tmpdir
Definition darktable.h:589
dt_pthread_mutex_t readFile_mutex
Definition darktable.h:569
char * cachedir
Definition darktable.h:591
dt_codepath_t codepath
Definition darktable.h:523
struct dt_lib_t * lib
Definition darktable.h:537
int32_t unmuted_signal_dbg_acts
Definition darktable.h:597
struct dt_imageio_t * imageio
Definition darktable.h:550
struct dt_dev_pixelpipe_cache_t * pixelpipe_cache
Definition darktable.h:556
int32_t num_openmp_threads
Definition darktable.h:524
struct dt_l10n_t * l10n
Definition darktable.h:555
struct dt_gui_gtk_t * gui
Definition darktable.h:541
dt_pthread_rwlock_t database_threadsafe
Definition darktable.h:582
struct dt_colorspaces_t * color_profiles
Definition darktable.h:554
GList * capabilities
Definition darktable.h:533
GTimeZone * utc_tz
Definition darktable.h:599
char * sharedir
Definition darktable.h:586
struct dt_collection_t * collection
Definition darktable.h:547
struct dt_mipmap_cache_t * mipmap_cache
Definition darktable.h:542
struct dt_selection_t * selection
Definition darktable.h:548
GList * iop
Definition darktable.h:527
dt_pthread_mutex_t exiv2_threadsafe
Definition darktable.h:566
struct dt_sys_resources_t dtresources
Definition darktable.h:601
dt_pthread_mutex_t plugin_threadsafe
Definition darktable.h:559
dt_lua_state_t lua_state
Definition darktable.h:593
char * moduledir
Definition darktable.h:587
dt_pthread_mutex_t capabilities_threadsafe
Definition darktable.h:562
GList * iop_order_list
Definition darktable.h:528
const struct dt_database_t * db
Definition darktable.h:545
GList * iop_order_rules
Definition darktable.h:529
struct dt_control_signal_t * signals
Definition darktable.h:540
struct dt_bauhaus_t * bauhaus
Definition darktable.h:544
struct dt_opencl_t * opencl
Definition darktable.h:551
char * configdir
Definition darktable.h:590
char * datadir
Definition darktable.h:585
GList * themes
Definition darktable.h:596
int32_t unmuted
Definition darktable.h:526
struct dt_image_cache_t * image_cache
Definition darktable.h:543
struct dt_develop_t * develop
Definition darktable.h:536
struct dt_points_t * points
Definition darktable.h:549
char * localedir
Definition darktable.h:588
dt_pthread_mutex_t pipeline_threadsafe
Definition darktable.h:574
struct dt_view_manager_t * view_manager
Definition darktable.h:538
char * kerneldir
Definition darktable.h:592
JsonParser * noiseprofile_parser
Definition darktable.h:534
GList * guides
Definition darktable.h:594
gboolean unmuted_signal_dbg[DT_SIGNAL_COUNT]
Definition darktable.h:598
char * progname
Definition darktable.h:584
struct dt_conf_t * conf
Definition darktable.h:535
GDateTime * origin_gdt
Definition darktable.h:600
const struct dt_pwstorage_t * pwstorage
Definition darktable.h:546
double start_wtime
Definition darktable.h:595
struct dt_control_t * control
Definition darktable.h:539
Definition darktable.h:503
unsigned int OPENMP_SIMD
Definition darktable.h:506
unsigned int _no_intrinsics
Definition darktable.h:505
unsigned int SSE2
Definition darktable.h:504
Definition collection.h:142
Definition colorspaces.h:152
Definition common/database.c:60
Definition pixelpipe_cache.h:40
Definition image_cache.h:29
Definition imageio_module.h:114
Definition mipmap_cache.h:83
Definition pwstorage.h:30
Definition selection.c:27
Definition darktable.h:510
size_t headroom_memory
Definition darktable.h:513
size_t total_memory
Definition darktable.h:511
size_t mipmap_memory
Definition darktable.h:512
size_t pixelpipe_memory
Definition darktable.h:514
size_t buffer_memory
Definition darktable.h:515
size_t darkroom_cache
Definition darktable.h:518
Definition darktable.h:605
double clock
Definition darktable.h:606
double user
Definition darktable.h:607
Definition views/view.h:139
Definition getrusage.h:30
struct timeval ru_utime
Definition getrusage.h:31
#define dt_alloc_align(B)
Definition tests/cache.c:22