37 const uint32_t history_end, GList *start_node,
38 const char *debug_label);
43 const guint64 producer_node_key,
68 = { .
lock = { PTHREAD_MUTEX_INITIALIZER }, .pending = NULL, .connected =
FALSE,
69 .wait_cursor_active =
FALSE,
70 .next_request_id = 1, .queued_requests = 0, .served_requests = 0,
71 .cancelled_requests = 0, .immediate_hits = 0, .misses = 0 };
76 return G_SOURCE_REMOVE;
79 return G_SOURCE_REMOVE;
85 return G_SOURCE_REMOVE;
89 return G_SOURCE_REMOVE;
109 const char *context = !
IS_NULL_PTR(reason) ? reason :
"unspecified";
110 const int64_t now_us = g_get_monotonic_time();
122 "[cache-wait] dump reason=%s pending=%u queued=%" PRIu64
" served=%" PRIu64
123 " cancelled=%" PRIu64
" immediate=%" PRIu64
" misses=%" PRIu64
"\n",
136 "[cache-wait] pending id=%" PRIu64
" owner=%s hash=%" PRIu64
137 " target=%s connected=%d age_ms=%" PRId64
"\n",
141 !
IS_NULL_PTR(wait->module) ? wait->module->op :
"backbuf",
156 return !strcmp(module->
op,
"initialscale") || !strcmp(module->
op,
"colorout");
167 return !strcmp(module->
op,
"gamma");
173 return g_strdup(
"virtual-preview");
180 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
183 if(!
IS_NULL_PTR(piece) && !strcmp(piece->module->op,
"detailmask"))
return nodes;
194 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
199 if(!strcmp(piece->module->op,
"detailmask")) detailmask_piece = piece;
213 detailmask_piece->
enabled = enabled;
215 if(!
IS_NULL_PTR(detailmask_piece->
data)) *((
int *)detailmask_piece->
data) = enabled ? 1 : 0;
251 if(!transient && !realtime)
return FALSE;
254 if(history_end == 0)
return FALSE;
293 GList *last_item = g_list_nth(dev->
history, history_end - 1);
343 gboolean current_output_must_cache_host =
TRUE;
345 for(GList *pieces = g_list_last(pipe->
nodes); pieces; pieces = g_list_previous(pieces))
351 gboolean supports_opencl =
FALSE;
356 gchar *
string = g_strdup_printf(
"/plugins/%s/cache", module->op);
365 const gboolean global_hist_output_on
367 const gboolean global_hist_input_on
369 const gboolean module_hist_on
375 const gboolean active_in_gui
381 const gboolean previous_output_must_cache_host
382 = !supports_opencl || active_in_gui || module_hist_on || global_hist_input_on || has_autoset;
385 = authored_cache || user_requested_cache || color_picker_on
386 || global_hist_output_on
387 || current_output_must_cache_host;
395 current_output_must_cache_host = previous_output_must_cache_host || current_output_must_cache_host;
503 && dev->
gui_module->operation_tags_filter() & current_module->operation_tags())
511 const int width_in,
const int height_in,
516 gchar *pipe_name = NULL;
520 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
534 module->modify_roi_out(module, pipe, piece, &roi_out, &roi_in);
543 "[roi-out] pipe=%-15s module=%-18s enabled=%d in =(x=%5d y=%5d w=%5d h=%5d scale=%2.2f)"
544 " out=(x=%5d y=%5d w=%5d h=%5d scale=%2.2f)\n",
545 pipe_name, module->op, piece->
enabled,
553 if(pipe_name)
dt_free(pipe_name);
573 gchar *pipe_name = NULL;
576 for(GList *nodes = g_list_last(pipe->
nodes); nodes; nodes = g_list_previous(nodes))
590 module->modify_roi_in(module, pipe, piece, &roi_out_temp, &roi_in);
592 roi_in = roi_out_temp;
600 "[roi-in ] pipe=%-15s module=%-18s enabled=%d out=(x=%5d y=%5d w=%5d h=%5d scale=%2.2f)"
601 " in=(x=%5d y=%5d w=%5d h=%5d scale=%2.2f)\n",
602 pipe_name, module->op, piece->
enabled,
603 roi_out_temp.
x, roi_out_temp.
y, roi_out_temp.
width, roi_out_temp.
height, roi_out_temp.
scale,
607 roi_out_temp = roi_in;
610 if(pipe_name)
dt_free(pipe_name);
616 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
627 && (!piece->
enabled || strcmp(piece->module->op,
"rawprepare")))
658 return dt_hash(hash, (
const char *)&pos,
sizeof(
int));
667 for(GList *node = g_list_first(pipe->
nodes); node; node = g_list_next(node))
670 if(piece && piece->
enabled && piece->module == module)
682 GList *node = g_list_find(pipe->
nodes, (gpointer)piece);
685 for(node = g_list_previous(node); node; node = g_list_previous(node))
688 if(previous && previous->
enabled)
699 gpointer restart_data)
752 if(!
IS_NULL_PTR(cache_entry)) *cache_entry = entry;
764 gboolean request_cacheline =
TRUE;
767 const gboolean changed_target = !wait->
connected
768 || wait->
pipe != pipe
769 || wait->module != (!
IS_NULL_PTR(piece) ? piece->module : NULL)
770 || wait->
hash != hash
774 gboolean activate_wait_cursor =
FALSE;
777 wait->module = !
IS_NULL_PTR(piece) ? piece->module : NULL;
785 piece->module->multi_priority)
812 activate_wait_cursor =
TRUE;
815 if(activate_wait_cursor)
819 "[cache-wait] queued id=%" PRIu64
" owner=%s hash=%" PRIu64
" target=%s\n",
823 !
IS_NULL_PTR(wait->module) ? wait->module->op :
"backbuf");
827 !
IS_NULL_PTR(wait->module) ? wait->module->op : NULL,
828 !
IS_NULL_PTR(wait->module) ? wait->module->multi_priority : 0,
836 request_cacheline =
FALSE;
844 !
IS_NULL_PTR(wait->module) ? wait->module->op : NULL,
845 !
IS_NULL_PTR(wait->module) ? wait->module->multi_priority : 0,
850 if(request_cacheline)
858 dt_print(
DT_DEBUG_DEV,
"[pixelpipe/gui] request host cache pipe=%s target=%s hash=%" PRIu64
"\n",
894 const guint64 producer_node_key,
897 GList *to_restart = NULL;
898 gboolean restore_wait_cursor =
FALSE;
899 const gboolean node_key_valid
905 GList *next = g_list_next(iter);
908 const gboolean node_match = node_key_valid && !
IS_NULL_PTR(wait)
915 to_restart = g_list_prepend(to_restart, wait);
930 restore_wait_cursor =
TRUE;
933 if(restore_wait_cursor)
936 for(GList *iter = to_restart; iter; iter = g_list_next(iter))
944 const gboolean drift_serve = wait->
hash != hash;
947 "[cache-wait] served id=%" PRIu64
" owner=%s awaited=%" PRIu64
" published=%" PRIu64
952 !
IS_NULL_PTR(wait->module) ? wait->module->op :
"backbuf",
953 drift_serve ?
" (drift: node-key)" :
"");
957 !
IS_NULL_PTR(wait->module) ? wait->module->op : NULL,
958 !
IS_NULL_PTR(wait->module) ? wait->module->multi_priority : 0,
961 drift_serve ?
"served (drift: node-key)" :
"served");
973 g_list_free(to_restart);
979 gboolean restore_wait_cursor =
FALSE;
980 int64_t queued_at_us = 0;
986 const char *cancel_reason = !
IS_NULL_PTR(reason) ? reason :
"unspecified";
1005 restore_wait_cursor =
TRUE;
1008 if(restore_wait_cursor)
1011 const int64_t age_ms = queued_at_us > 0 ?
MAX((g_get_monotonic_time() - queued_at_us) / 1000, 0) : -1;
1013 "[cache-wait] cancelled id=%" PRIu64
" owner=%s hash=%" PRIu64
1014 " target=%s age_ms=%" PRId64
" reason=%s\n",
1016 !
IS_NULL_PTR(owner_tag) ? owner_tag :
"(unknown)",
1025 g_snprintf(note,
sizeof(note),
"cancelled: %s", cancel_reason);
1028 !
IS_NULL_PTR(module) ?
module->multi_priority : 0,
1029 !IS_NULL_PTR(cancel_pipe) ? (int)cancel_pipe->type : -1,
1030 !IS_NULL_PTR(cancel_pipe) ? cancel_pipe->imgid : -1, FALSE, note);
1034 wait->module = NULL;
1044 const char *owner_tag,
1045 gpointer owner_object)
1076 default:
return "?";
1083 piece->
dsc_in = *upstream_dsc;
1084 piece->
dsc_out = *upstream_dsc;
1093 piece->module->input_format(piece->module, pipe, piece, &piece->
dsc_in);
1116 piece->module->output_format(piece->module, pipe, piece, &piece->
dsc_out);
1121 piece->
dsc_in = actual_input_dsc;
1122 piece->
dsc_out = actual_input_dsc;
1127 *upstream_dsc = piece->
dsc_out;
1159 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
1169 piece->
dsc_in = actual_input_dsc;
1170 piece->
dsc_out = actual_input_dsc;
1183 piece->module->input_format(piece->module, pipe, piece, &declared_in);
1189 const gboolean input_mismatch
1190 = (declared_in.
bpp != actual_input_dsc.
bpp
1196 dt_control_log(_(
"disabled module `%s`: unexpected input buffer format"),
1197 piece->module->name());
1199 "[pixelpipe] disabling module %s because input format expects %" G_GSIZE_FORMAT
1200 " B/px, %u channels, filters %u but upstream publishes %" G_GSIZE_FORMAT
1201 " B/px, %u channels, filters %u\n",
1210 piece->
dsc_in = actual_input_dsc;
1211 piece->
dsc_out = actual_input_dsc;
1229 piece->
dsc_in = declared_in;
1236 "[dsc] pipe=%s module=%s enabled=%d in=(cst=%s ch=%i bpp=%" G_GSIZE_FORMAT
1237 " filters=%u) out=(cst=%s ch=%i bpp=%" G_GSIZE_FORMAT
" filters=%u)\n",
1238 pipe_name, piece->module->op, piece->
enabled,
1242 upstream_dsc = piece->
dsc_out;
1249 const char *debug_label)
1254 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
1263 piece->
enabled = piece->module->default_enabled;
1269 gboolean found_history =
FALSE;
1271 for(GList *history = g_list_nth(dev->
history, history_end - 1);
1273 history = g_list_previous(history))
1276 if(piece->module == hist->module)
1281 history_param_hash = hist->
hash;
1282 found_history =
TRUE;
1288 if(!strcmp(piece->module->op,
"detailmask"))
1300 piece->module->multi_priority, piece->module->iop_order, pipe->
type, pipe->
imgid);
1304 piece->module->op, piece->module->multi_name, debug_label);
1317 const uint32_t history_end, GList *start_node,
1318 const char *debug_label)
1324 for(GList *node = g_list_first(pipe->
nodes); node && node != start_node; node = g_list_next(node))
1329 upstream_dsc = piece->
dsc_out;
1332 for(GList *nodes = start_node; nodes; nodes = g_list_next(nodes))
1342 piece->
enabled = piece->module->default_enabled;
1348 gboolean found_history =
FALSE;
1350 for(GList *history = g_list_nth(pipe->
dev->
history, history_end - 1);
1352 history = g_list_previous(history))
1355 if(piece->module == hist->module)
1360 history_param_hash = hist->
hash;
1361 found_history =
TRUE;
1367 if(!strcmp(piece->module->op,
"detailmask"))
1379 piece->module->multi_priority, piece->module->iop_order, pipe->
type, pipe->
imgid);
1383 piece->module->op, piece->module->multi_name, debug_label);
1390 if(detailmask_node && detailmask_node != start_node)
1406 gboolean passthrough_preview =
FALSE;
1411 gboolean bypass_cache =
FALSE;
1413 for(GList *node = g_list_first(pipe->
nodes); node; node = g_list_next(node))
1429 if(passthrough_preview
1460 local_hash =
dt_hash(local_hash, (
const char *)&piece->module->request_mask_display,
sizeof(
int));
1470 local_hash =
dt_hash(local_hash, (
const char *)&revision,
sizeof(revision));
1482 local_hash =
dt_hash(local_hash, (
const char *)&piece->module->bypass_cache_variant,
sizeof(
int));
1487 local_hash =
dt_hash(local_hash, (
const char *)&zero,
sizeof(
int));
1488 local_hash =
dt_hash(local_hash, (
const char *)&zero,
sizeof(
int));
1496 local_hash =
dt_hash(local_hash, (
const char *)&bypass_distort,
sizeof(
int));
1509 "[pixelpipe] global hash for %20s (%s) in pipe %s enabled=%d bypass_cache=%d with hash %lu\n",
1511 (
long unsigned int)hash);
1532 passthrough_preview =
TRUE;
1554 dt_print(
DT_DEBUG_DEV,
"[pixelpipe] synch all modules with history for pipe %s called from %s\n",
type, caller_func);
1560 GList *last_item = g_list_nth(pipe->
dev->
history, history_end - 1);
1583 GList *last_item = g_list_nth(pipe->
dev->
history, history_end - 1);
1586 GList *first_item = NULL;
1587 for(GList *history = last_item; history; history = g_list_previous(history))
1590 first_item = history;
1596 GList *fence_item = g_list_nth(pipe->
dev->
history, history_end);
1597 for(GList *history = first_item; history && history != fence_item; history = g_list_next(history))
1600 if(!hist || !hist->module)
continue;
1603 for(GList *nodes = g_list_last(pipe->
nodes); nodes; nodes = g_list_previous(nodes))
1606 if(
IS_NULL_PTR(piece) || piece->module != hist->module)
continue;
1631 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
1637 dt_iop_commit_params(module, module->default_params, module->default_blendop_params, pipe, piece);
1658 char *status_str = g_strdup_printf(
"%s%s%s%s%s%s%s",
1667 dt_print(
DT_DEBUG_DEV,
"[dt_dev_pixelpipe_change] pipeline state changing for pipe %s, flag %s\n",
1689 const double _history_mutex_hold_start =
dt_get_wtime();
1695 gboolean formats_propagated =
FALSE;
1717 formats_propagated =
TRUE;
1731 const double _history_mutex_hold_ms = (
dt_get_wtime() - _history_mutex_hold_start) * 1000.0;
1732 if(_history_mutex_hold_ms > 1.0)
1734 "[dt_dev_pixelpipe_change] tid %lu pipe %s held history_mutex for %.2f ms (status 0x%x)\n",
1735 (
unsigned long)pthread_self(),
type, _history_mutex_hold_ms, (
unsigned)status);
1743 if(!formats_propagated)
1754 dt_show_times_f(&start,
"[dev_pixelpipe] pipeline resync with history",
"for pipe %s",
type);
void dt_atomic_set_int(dt_atomic_int *var, int value)
int dt_atomic_get_int(dt_atomic_int *var)
int dt_atomic_exch_int(dt_atomic_int *var, int value)
gboolean dt_iop_color_picker_force_cache(const dt_dev_pixelpipe_t *pipe, const dt_iop_module_t *module)
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
int dt_conf_key_exists(const char *key)
gboolean dt_conf_key_not_empty(const char *name)
void dt_control_log(const char *msg,...)
void dt_control_queue_redraw_center()
request redraw of center window. This redraws the center view within a gdk critical section to preven...
void dt_control_change_cursor_by_name_and_flush(const char *curs_str)
Apply a named cursor immediatelly and flush display updates for immediate feedback.
void dt_control_commit_cursor()
void dt_control_navigation_redraw()
request redraw of the navigation widget. This redraws the wiget of the navigation module.
void dt_show_times_f(const dt_times_t *start, const char *prefix, const char *suffix,...)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
void void void gboolean dt_gui_widgets_suppressed(void)
static void dt_get_times(dt_times_t *t)
static uint64_t dt_hash(uint64_t hash, const char *str, size_t size)
static double dt_get_wtime(void)
#define DT_MAX_FILENAME_LEN
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
gboolean dt_dev_transient_params_get(dt_develop_t *dev, const dt_iop_module_t *module, void *out_params, const size_t out_params_size, void *out_blend, const size_t out_blend_size, gboolean *out_has_blend)
dt_dev_history_item_t * dt_dev_history_get_last_item_by_module(GList *history_list, dt_iop_module_t *module, int history_end)
Find the last history item referencing a module up to history_end.
gboolean dt_dev_transient_params_active(dt_develop_t *dev, const dt_iop_module_t *module)
int32_t dt_dev_get_history_end_ext(struct dt_develop_t *dev)
Get the current history end index (GUI perspective).
static void _sync_pipe_nodes_from_history_from_node(dt_dev_pixelpipe_t *pipe, const uint32_t history_end, GList *start_node, const char *debug_label)
void dt_dev_pixelpipe_propagate_formats(dt_dev_pixelpipe_t *pipe)
void dt_dev_pixelpipe_update_zoom_main_real(dt_develop_t *dev)
static gboolean _cache_wait_cursor_restore(gpointer user_data)
static void _prepare_piece_input_contract(dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, const dt_iop_buffer_dsc_t *upstream_dsc)
void dt_dev_pixelpipe_update_history_all_real(dt_develop_t *dev)
const dt_dev_pixelpipe_iop_t * dt_dev_pixelpipe_get_module_piece(const dt_dev_pixelpipe_t *pipe, const dt_iop_module_t *module)
void dt_dev_pixelpipe_update_history_main_real(dt_develop_t *dev)
void dt_dev_pixelpipe_synch_top(dt_dev_pixelpipe_t *pipe)
static void _refresh_pipe_detail_mask_state(dt_dev_pixelpipe_t *pipe)
void dt_dev_pixelpipe_cache_wait_cleanup(dt_dev_pixelpipe_cache_wait_t *wait, const char *reason)
Cancel one pending GUI cache wait request and clear its runtime state.
uint64_t dt_dev_pixelpipe_node_hash(dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const dt_iop_roi_t roi_out, const int pos)
const dt_dev_pixelpipe_iop_t * dt_dev_pixelpipe_get_prev_enabled_piece(const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece)
static dt_dev_pixelpipe_cache_wait_record_t * _cache_wait_manager_remove_wait_locked(dt_dev_pixelpipe_cache_wait_t *wait)
void dt_pixelpipe_get_global_hash(dt_dev_pixelpipe_t *pipe)
gboolean dt_dev_pixelpipe_is_backbufer_valid(dt_dev_pixelpipe_t *pipe)
void dt_dev_pixelpipe_reset_all(dt_develop_t *dev)
static void _commit_piece_contract(dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, dt_iop_params_t *params, dt_develop_blend_params_t *blend_params, dt_iop_buffer_dsc_t *upstream_dsc)
void dt_dev_pixelpipe_get_roi_out(dt_dev_pixelpipe_t *pipe, const int width_in, const int height_in, int *width, int *height)
static void _sync_pipe_nodes_from_history(dt_dev_pixelpipe_t *pipe, dt_develop_t *dev, const uint32_t history_end, const char *debug_label)
void dt_dev_pixelpipe_change(dt_dev_pixelpipe_t *pipe)
static const char * _dsc_cst_name(const int cst)
void dt_dev_pixelpipe_cache_wait_dump_pending(const char *reason)
Dump pending GUI cache wait requests for lifecycle debugging.
static gchar * _get_debug_pipe_name(const dt_dev_pixelpipe_t *pipe, const dt_develop_t *dev)
static void _change_pipe(dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_change_t flag)
void dt_dev_pixelpipe_change_zoom_main(dt_develop_t *dev)
void dt_dev_pixelpipe_synch_all_real(dt_dev_pixelpipe_t *pipe, const char *caller_func)
Find the last history item matching each pipeline node (module), in the order of pipeline execution....
void dt_dev_pixelpipe_sync_no_history(dt_dev_pixelpipe_t *pipe)
void dt_dev_pixelpipe_sync_virtual(dt_develop_t *dev, dt_dev_pixelpipe_change_t flag)
static GList * _find_detailmask_node(dt_dev_pixelpipe_t *pipe)
void dt_dev_pixelpipe_rebuild_all_real(dt_develop_t *dev)
static void _sync_virtual_pipe(dt_develop_t *dev, dt_dev_pixelpipe_change_t flag)
static gboolean _sync_focused_in_place(dt_dev_pixelpipe_t *pipe)
Re-commit the focused module's piece in place from transient (or realtime) params.
static void _dt_dev_pixelpipe_cache_wait_ready_callback(gpointer instance, const guint64 hash, const guint64 producer_node_key, gpointer user_data)
Serve queued GUI cache waiters matching one published cacheline hash.
void dt_dev_pixelpipe_cache_wait_set_owner(dt_dev_pixelpipe_cache_wait_t *wait, const char *owner_tag, gpointer owner_object)
Attach debug ownership metadata to one cache wait request.
void dt_dev_pixelpipe_get_roi_in(dt_dev_pixelpipe_t *pipe, const struct dt_iop_roi_t roi_out)
static void _seal_opencl_cache_policy(dt_dev_pixelpipe_t *pipe)
Seal host-cache retention policy on synchronized pieces before processing starts.
void dt_dev_pixelpipe_update_history_preview_real(dt_develop_t *dev)
void dt_dev_pixelpipe_update_zoom_preview_real(dt_develop_t *dev)
gboolean dt_dev_pixelpipe_is_pipeline_valid(dt_dev_pixelpipe_t *pipe)
static uint64_t _default_pipe_hash(dt_dev_pixelpipe_t *pipe)
static gboolean _cache_wait_cursor_progress(gpointer user_data)
void dt_dev_pixelpipe_resync_history_all_real(dt_develop_t *dev)
static dt_dev_pixelpipe_cache_wait_manager_t _cache_wait_manager
gboolean dt_dev_pixelpipe_activemodule_disables_currentmodule(struct dt_develop_t *dev, struct dt_iop_module_t *current_module)
static gboolean _module_requires_global_histogram_output_cache(const dt_dev_pixelpipe_t *pipe, const dt_iop_module_t *module)
void dt_dev_pixelpipe_resync_history_main_real(dt_develop_t *dev)
void dt_dev_pixelpipe_resync_history_preview_real(dt_develop_t *dev)
static gboolean _module_requires_global_histogram_input_cache(const dt_dev_pixelpipe_t *pipe, const dt_iop_module_t *module)
gboolean dt_dev_pixelpipe_cache_peek_gui(dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, void **data, dt_pixel_cache_entry_t **cache_entry, dt_dev_pixelpipe_cache_wait_t *wait, dt_dev_pixelpipe_cache_ready_callback_t restart, gpointer restart_data)
#define dt_dev_pixelpipe_rebuild_all(dev)
void(* dt_dev_pixelpipe_cache_ready_callback_t)(gpointer user_data)
#define dt_dev_pixelpipe_resync_history_preview(dev)
#define dt_dev_pixelpipe_resync_history_main(dev)
#define dt_dev_pixelpipe_update_history_main(dev)
#define dt_dev_pixelpipe_update_zoom_main(dev)
#define dt_dev_pixelpipe_update_history_preview(dev)
void dt_dev_update_mouse_effect_radius(dt_develop_t *dev)
Convert absolute output-image coordinates to input image space by calling dt_dev_coordinates_image_ab...
static uint64_t dt_dev_get_history_hash(const dt_develop_t *dev)
@ DT_DEV_PIXELPIPE_DISPLAY_NONE
@ DT_DEV_DETAIL_MASK_ENABLED
@ DT_DEV_DETAIL_MASK_NONE
static int dt_pthread_rwlock_unlock(dt_pthread_rwlock_t *rwlock)
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_trylock(dt_pthread_mutex_t *mutex) TRY_ACQUIRE(0
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_rwlock_rdlock(dt_pthread_rwlock_t *rwlock)
GtkWidget * dt_ui_center(dt_ui_t *ui)
get the center drawable widget
void dt_iop_commit_params(dt_iop_module_t *module, dt_iop_params_t *params, dt_develop_blend_params_t *blendop_params, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
gboolean dt_iop_get_cache_bypass(dt_iop_module_t *module)
@ IOP_FLAGS_NO_HISTORY_STACK
int dt_opencl_is_inited(void)
@ DT_DEV_PIXELPIPE_PREVIEW
void dt_dev_pixelpipe_cache_flush(dt_dev_pixelpipe_cache_t *cache, const int id)
Remove cache lines matching id. Entries locked in read/write or having reference count greater than 0...
gboolean dt_dev_pixelpipe_cache_peek(dt_dev_pixelpipe_cache_t *cache, const uint64_t hash, void **data, dt_pixel_cache_entry_t **entry, const int preferred_devid, void **cl_mem_output)
Non-owning lookup of an existing cache line.
Pixelpipe cache for storing intermediate results in the pixelpipe.
#define DT_PIXELPIPE_CACHE_HASH_INVALID
void dt_dev_pixelpipe_set_input(dt_dev_pixelpipe_t *pipe, int32_t imgid, int width, int height, float iscale, dt_mipmap_size_t size)
gboolean dt_dev_pixelpipe_get_realtime(const dt_dev_pixelpipe_t *pipe)
char * dt_pixelpipe_get_pipe_name(dt_dev_pixelpipe_type_t pipe_type)
void dt_dev_pixelpipe_create_nodes(dt_dev_pixelpipe_t *pipe)
void dt_dev_pixelpipe_set_realtime(dt_dev_pixelpipe_t *pipe, gboolean state)
void dt_dev_pixelpipe_cleanup_nodes(dt_dev_pixelpipe_t *pipe)
static void dt_dev_pixelpipe_set_hash(dt_dev_pixelpipe_t *pipe, const uint64_t hash)
static uint64_t dt_dev_backbuf_get_history_hash(const dt_backbuf_t *backbuf)
static uint64_t dt_dev_pixelpipe_get_hash(const dt_dev_pixelpipe_t *pipe)
static void dt_dev_pixelpipe_or_changed(dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_change_t flags)
static void dt_dev_pixelpipe_set_cache_request(dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_cache_request_t request, const struct dt_iop_module_t *module)
dt_dev_pixelpipe_change_t
@ DT_DEV_PIPE_CACHE_REQUEST
@ DT_DEV_PIPE_TOP_CHANGED
static uint64_t dt_dev_pixelpipe_get_history_hash(const dt_dev_pixelpipe_t *pipe)
static void dt_dev_pixelpipe_set_history_hash(dt_dev_pixelpipe_t *pipe, const uint64_t history_hash)
#define dt_dev_pixelpipe_synch_all(pipe)
static uint64_t dt_dev_backbuf_get_hash(const dt_backbuf_t *backbuf)
@ DT_DEV_PIXELPIPE_CACHE_REQUEST_BACKBUF
@ DT_DEV_PIXELPIPE_CACHE_REQUEST_MODULE
#define DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(ctlsig, cb, user_data)
@ DT_SIGNAL_CACHELINE_READY
This signal is raised when one cacheline write lock is released. 1 : uint64_t cacheline hash no retur...
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
unsigned __int64 uint64_t
struct dt_dev_pixelpipe_cache_t * pixelpipe_cache
struct dt_gui_gtk_t * gui
struct dt_control_signal_t * signals
struct dt_control_t * control
struct dt_develop_blend_params_t * blend_params
struct dt_iop_module_t *gboolean enabled
uint64_t cancelled_requests
gboolean wait_cursor_active
dt_dev_pixelpipe_cache_wait_t * wait
struct dt_dev_pixelpipe_t * pipe
const struct dt_iop_module_t *uint64_t hash
dt_dev_pixelpipe_cache_ready_callback_t restart
dt_iop_buffer_dsc_t dsc_out
dt_dev_request_flags_t request_histogram
dt_iop_buffer_dsc_t dsc_in
uint64_t global_mask_hash
struct dt_iop_module_t *void * data
gboolean cache_output_on_ram
gpointer last_history_item
gboolean gui_observable_source
uint64_t last_history_hash
dt_dev_pixelpipe_type_t type
struct dt_develop_t * dev
struct dt_iop_module_t * gui_module
dt_pthread_rwlock_t history_mutex
struct dt_dev_pixelpipe_t * preview_pipe
struct dt_dev_pixelpipe_t * virtual_pipe
dt_atomic_int mask_preview_settings_revision
Revision of the global mask-preview appearance.
struct dt_develop_t::@17 roi
struct dt_dev_pixelpipe_t * pipe
char filename[DT_MAX_FILENAME_LEN]
dt_iop_buffer_type_t datatype
GModule *dt_dev_operation_t op
Region of interest passed through the pixelpipe.
void dt_supervisor_cache_wait(const dt_sv_op_t op, const uint64_t request_id, const uint64_t awaited_hash, const char *owner_tag, const char *op_name, const int multi_priority, const int pipe_type, const int32_t imgid, const gboolean request_emitted, const char *note)
uint64_t dt_supervisor_node_key(const int pipe_type, const char *op_name, const int multi_priority)
void dt_supervisor_node(const dt_sv_op_t op, const uint64_t node_hash, const uint64_t param_hash, const uint64_t predecessor_hash, const char *op_name, const int multi_priority, const int iop_order, const int pipe_type, const int32_t imgid)
static gboolean dt_supervisor_active(void)