36 const uint32_t history_end, GList *start_node,
37 const char *debug_label);
66 = { .
lock = { PTHREAD_MUTEX_INITIALIZER }, .pending = NULL, .connected =
FALSE,
67 .wait_cursor_active =
FALSE,
68 .next_request_id = 1, .queued_requests = 0, .served_requests = 0,
69 .cancelled_requests = 0, .immediate_hits = 0, .misses = 0 };
74 return G_SOURCE_REMOVE;
77 return G_SOURCE_REMOVE;
83 return G_SOURCE_REMOVE;
87 return G_SOURCE_REMOVE;
107 const char *context = !
IS_NULL_PTR(reason) ? reason :
"unspecified";
108 const int64_t now_us = g_get_monotonic_time();
120 "[cache-wait] dump reason=%s pending=%u queued=%" PRIu64
" served=%" PRIu64
121 " cancelled=%" PRIu64
" immediate=%" PRIu64
" misses=%" PRIu64
"\n",
134 "[cache-wait] pending id=%" PRIu64
" owner=%s hash=%" PRIu64
135 " target=%s connected=%d age_ms=%" PRId64
"\n",
139 !
IS_NULL_PTR(wait->module) ? wait->module->op :
"backbuf",
154 return !strcmp(module->
op,
"initialscale") || !strcmp(module->
op,
"colorout");
165 return !strcmp(module->
op,
"gamma");
171 return g_strdup(
"virtual-preview");
178 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
181 if(!
IS_NULL_PTR(piece) && !strcmp(piece->module->op,
"detailmask"))
return nodes;
192 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
197 if(!strcmp(piece->module->op,
"detailmask")) detailmask_piece = piece;
211 detailmask_piece->
enabled = enabled;
213 if(!
IS_NULL_PTR(detailmask_piece->
data)) *((
int *)detailmask_piece->
data) = enabled ? 1 : 0;
249 if(!transient && !realtime)
return FALSE;
252 if(history_end == 0)
return FALSE;
291 GList *last_item = g_list_nth(dev->
history, history_end - 1);
341 gboolean current_output_must_cache_host =
TRUE;
343 for(GList *pieces = g_list_last(pipe->
nodes); pieces; pieces = g_list_previous(pieces))
349 gboolean supports_opencl =
FALSE;
354 gchar *
string = g_strdup_printf(
"/plugins/%s/cache", module->op);
363 const gboolean global_hist_output_on
365 const gboolean global_hist_input_on
367 const gboolean module_hist_on
373 const gboolean active_in_gui
379 const gboolean previous_output_must_cache_host
380 = !supports_opencl || active_in_gui || module_hist_on || global_hist_input_on || has_autoset;
383 = authored_cache || user_requested_cache || color_picker_on
384 || global_hist_output_on
385 || current_output_must_cache_host;
387 current_output_must_cache_host = previous_output_must_cache_host;
495 && dev->
gui_module->operation_tags_filter() & current_module->operation_tags())
503 const int width_in,
const int height_in,
508 gchar *pipe_name = NULL;
512 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
526 module->modify_roi_out(module, pipe, piece, &roi_out, &roi_in);
535 "[roi-out] pipe=%-15s module=%-18s enabled=%d in =(x=%5d y=%5d w=%5d h=%5d scale=%2.2f)"
536 " out=(x=%5d y=%5d w=%5d h=%5d scale=%2.2f)\n",
537 pipe_name, module->op, piece->
enabled,
545 if(pipe_name)
dt_free(pipe_name);
565 gchar *pipe_name = NULL;
568 for(GList *nodes = g_list_last(pipe->
nodes); nodes; nodes = g_list_previous(nodes))
582 module->modify_roi_in(module, pipe, piece, &roi_out_temp, &roi_in);
584 roi_in = roi_out_temp;
592 "[roi-in ] pipe=%-15s module=%-18s enabled=%d out=(x=%5d y=%5d w=%5d h=%5d scale=%2.2f)"
593 " in=(x=%5d y=%5d w=%5d h=%5d scale=%2.2f)\n",
594 pipe_name, module->op, piece->
enabled,
595 roi_out_temp.
x, roi_out_temp.
y, roi_out_temp.
width, roi_out_temp.
height, roi_out_temp.
scale,
599 roi_out_temp = roi_in;
602 if(pipe_name)
dt_free(pipe_name);
608 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
619 && (!piece->
enabled || strcmp(piece->module->op,
"rawprepare")))
650 return dt_hash(hash, (
const char *)&pos,
sizeof(
int));
659 for(GList *node = g_list_first(pipe->
nodes); node; node = g_list_next(node))
662 if(piece && piece->
enabled && piece->module == module)
674 GList *node = g_list_find(pipe->
nodes, (gpointer)piece);
677 for(node = g_list_previous(node); node; node = g_list_previous(node))
680 if(previous && previous->
enabled)
691 gpointer restart_data)
744 if(!
IS_NULL_PTR(cache_entry)) *cache_entry = entry;
756 gboolean request_cacheline =
TRUE;
759 const gboolean changed_target = !wait->
connected
760 || wait->
pipe != pipe
761 || wait->module != (!
IS_NULL_PTR(piece) ? piece->module : NULL)
762 || wait->
hash != hash
766 gboolean activate_wait_cursor =
FALSE;
769 wait->module = !
IS_NULL_PTR(piece) ? piece->module : NULL;
796 activate_wait_cursor =
TRUE;
799 if(activate_wait_cursor)
803 "[cache-wait] queued id=%" PRIu64
" owner=%s hash=%" PRIu64
" target=%s\n",
807 !
IS_NULL_PTR(wait->module) ? wait->module->op :
"backbuf");
814 request_cacheline =
FALSE;
818 if(request_cacheline)
826 dt_print(
DT_DEBUG_DEV,
"[pixelpipe/gui] request host cache pipe=%s target=%s hash=%" PRIu64
"\n",
853 GList *to_restart = NULL;
854 gboolean restore_wait_cursor =
FALSE;
859 GList *next = g_list_next(iter);
867 to_restart = g_list_prepend(to_restart, wait);
882 restore_wait_cursor =
TRUE;
885 if(restore_wait_cursor)
888 for(GList *iter = to_restart; iter; iter = g_list_next(iter))
895 "[cache-wait] served id=%" PRIu64
" owner=%s hash=%" PRIu64
" target=%s\n",
899 !
IS_NULL_PTR(wait->module) ? wait->module->op :
"backbuf");
910 g_list_free(to_restart);
916 gboolean restore_wait_cursor =
FALSE;
917 int64_t queued_at_us = 0;
922 const char *cancel_reason = !
IS_NULL_PTR(reason) ? reason :
"unspecified";
941 restore_wait_cursor =
TRUE;
944 if(restore_wait_cursor)
947 const int64_t age_ms = queued_at_us > 0 ?
MAX((g_get_monotonic_time() - queued_at_us) / 1000, 0) : -1;
949 "[cache-wait] cancelled id=%" PRIu64
" owner=%s hash=%" PRIu64
950 " target=%s age_ms=%" PRId64
" reason=%s\n",
968 const char *owner_tag,
969 gpointer owner_object)
1000 default:
return "?";
1007 piece->
dsc_in = *upstream_dsc;
1008 piece->
dsc_out = *upstream_dsc;
1017 piece->module->input_format(piece->module, pipe, piece, &piece->
dsc_in);
1040 piece->module->output_format(piece->module, pipe, piece, &piece->
dsc_out);
1045 piece->
dsc_in = actual_input_dsc;
1046 piece->
dsc_out = actual_input_dsc;
1051 *upstream_dsc = piece->
dsc_out;
1083 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
1093 piece->
dsc_in = actual_input_dsc;
1094 piece->
dsc_out = actual_input_dsc;
1107 piece->module->input_format(piece->module, pipe, piece, &declared_in);
1113 const gboolean input_mismatch
1114 = (declared_in.
bpp != actual_input_dsc.
bpp
1120 dt_control_log(_(
"disabled module `%s`: unexpected input buffer format"),
1121 piece->module->name());
1123 "[pixelpipe] disabling module %s because input format expects %" G_GSIZE_FORMAT
1124 " B/px, %u channels, filters %u but upstream publishes %" G_GSIZE_FORMAT
1125 " B/px, %u channels, filters %u\n",
1134 piece->
dsc_in = actual_input_dsc;
1135 piece->
dsc_out = actual_input_dsc;
1153 piece->
dsc_in = declared_in;
1160 "[dsc] pipe=%s module=%s enabled=%d in=(cst=%s ch=%i bpp=%" G_GSIZE_FORMAT
1161 " filters=%u) out=(cst=%s ch=%i bpp=%" G_GSIZE_FORMAT
" filters=%u)\n",
1162 pipe_name, piece->module->op, piece->
enabled,
1166 upstream_dsc = piece->
dsc_out;
1173 const char *debug_label)
1178 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
1187 piece->
enabled = piece->module->default_enabled;
1192 gboolean found_history =
FALSE;
1194 for(GList *history = g_list_nth(dev->
history, history_end - 1);
1196 history = g_list_previous(history))
1199 if(piece->module == hist->module)
1204 found_history =
TRUE;
1210 if(!strcmp(piece->module->op,
"detailmask"))
1216 piece->module->op, piece->module->multi_name, debug_label);
1229 const uint32_t history_end, GList *start_node,
1230 const char *debug_label)
1236 for(GList *node = g_list_first(pipe->
nodes); node && node != start_node; node = g_list_next(node))
1241 upstream_dsc = piece->
dsc_out;
1244 for(GList *nodes = start_node; nodes; nodes = g_list_next(nodes))
1254 piece->
enabled = piece->module->default_enabled;
1259 gboolean found_history =
FALSE;
1261 for(GList *history = g_list_nth(pipe->
dev->
history, history_end - 1);
1263 history = g_list_previous(history))
1266 if(piece->module == hist->module)
1271 found_history =
TRUE;
1277 if(!strcmp(piece->module->op,
"detailmask"))
1283 piece->module->op, piece->module->multi_name, debug_label);
1290 if(detailmask_node && detailmask_node != start_node)
1306 gboolean passthrough_preview =
FALSE;
1311 gboolean bypass_cache =
FALSE;
1313 for(GList *node = g_list_first(pipe->
nodes); node; node = g_list_next(node))
1329 if(passthrough_preview
1360 local_hash =
dt_hash(local_hash, (
const char *)&piece->module->request_mask_display,
sizeof(
int));
1370 local_hash =
dt_hash(local_hash, (
const char *)&revision,
sizeof(revision));
1376 local_hash =
dt_hash(local_hash, (
const char *)&zero,
sizeof(
int));
1384 local_hash =
dt_hash(local_hash, (
const char *)&bypass_distort,
sizeof(
int));
1397 piece->module->op, piece->module->multi_name,
type, (
long unsigned int)hash);
1418 passthrough_preview =
TRUE;
1440 dt_print(
DT_DEBUG_DEV,
"[pixelpipe] synch all modules with history for pipe %s called from %s\n",
type, caller_func);
1446 GList *last_item = g_list_nth(pipe->
dev->
history, history_end - 1);
1469 GList *last_item = g_list_nth(pipe->
dev->
history, history_end - 1);
1472 GList *first_item = NULL;
1473 for(GList *history = last_item; history; history = g_list_previous(history))
1476 first_item = history;
1482 GList *fence_item = g_list_nth(pipe->
dev->
history, history_end);
1483 for(GList *history = first_item; history && history != fence_item; history = g_list_next(history))
1486 if(!hist || !hist->module)
continue;
1489 for(GList *nodes = g_list_last(pipe->
nodes); nodes; nodes = g_list_previous(nodes))
1492 if(
IS_NULL_PTR(piece) || piece->module != hist->module)
continue;
1517 for(GList *nodes = g_list_first(pipe->
nodes); nodes; nodes = g_list_next(nodes))
1523 dt_iop_commit_params(module, module->default_params, module->default_blendop_params, pipe, piece);
1544 char *status_str = g_strdup_printf(
"%s%s%s%s%s%s%s",
1553 dt_print(
DT_DEBUG_DEV,
"[dt_dev_pixelpipe_change] pipeline state changing for pipe %s, flag %s\n",
1576 gboolean formats_propagated =
FALSE;
1598 formats_propagated =
TRUE;
1619 if(!formats_propagated)
1630 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,...)
static void dt_get_times(dt_times_t *t)
static uint64_t dt_hash(uint64_t hash, const char *str, size_t size)
#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.
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 _dt_dev_pixelpipe_cache_wait_ready_callback(gpointer instance, const guint64 hash, gpointer user_data)
Serve queued GUI cache waiters matching one published cacheline hash.
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_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
#define dt_pthread_rwlock_unlock
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
#define dt_pthread_rwlock_rdlock
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.