Skip to content

Commit

Permalink
Pixelpipe: remove superflous invalidation
Browse files Browse the repository at this point in the history
Add a debug framework showing where invalidations are called to follow the life cycle of the whole thing.
  • Loading branch information
aurelienpierre committed Dec 6, 2023
1 parent 3446e37 commit 786d31c
Show file tree
Hide file tree
Showing 22 changed files with 74 additions and 88 deletions.
12 changes: 6 additions & 6 deletions src/develop/blend_gui.c
Original file line number Diff line number Diff line change
Expand Up @@ -1081,7 +1081,7 @@ static void _blendop_blendif_tab_switch(GtkNotebook *notebook, GtkWidget *page,
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->colorpicker_set_values))))
{
dt_iop_color_picker_set_cst(data->module, _blendop_blendif_get_picker_colorspace(data));
dt_dev_invalidate_all(data->module->dev);
dt_dev_invalidate_all(data->module->dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(data->module->dev);
}

Expand Down Expand Up @@ -1131,7 +1131,7 @@ static void _blendop_blendif_details_callback(GtkWidget *slider, dt_iop_gui_blen

if((oldval == 0.0f) && (bp->details != 0.0f))
{
dt_dev_invalidate_all(data->module->dev);
dt_dev_invalidate_all(data->module->dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(data->module->dev);
}
}
Expand Down Expand Up @@ -1618,15 +1618,15 @@ static gboolean _blendif_change_blend_colorspace(dt_iop_module_t *module, dt_dev

dt_iop_gui_blend_data_t *bd = module->blend_data;
const int cst_old = _blendop_blendif_get_picker_colorspace(bd);
dt_dev_add_new_history_item(darktable.develop, module, FALSE);
dt_dev_add_history_item(darktable.develop, module, FALSE);
dt_iop_gui_update(module);

if(cst_old != _blendop_blendif_get_picker_colorspace(bd) &&
(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bd->colorpicker)) ||
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bd->colorpicker_set_values))))
{
dt_iop_color_picker_set_cst(bd->module, _blendop_blendif_get_picker_colorspace(bd));
dt_dev_invalidate_all(bd->module->dev);
dt_dev_invalidate_all(bd->module->dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(bd->module->dev);
}

Expand Down Expand Up @@ -2045,7 +2045,7 @@ void dt_iop_gui_update_blendif(dt_iop_module_t *module)
if(module->request_mask_display != (bd->save_for_leave & ~DT_DEV_PIXELPIPE_DISPLAY_STICKY))
{
module->request_mask_display = bd->save_for_leave & ~DT_DEV_PIXELPIPE_DISPLAY_STICKY;
dt_dev_invalidate_all(module->dev);//DBG
dt_dev_invalidate_all(module->dev, __FUNCTION__, __FILE__, __LINE__);//DBG
dt_dev_refresh_ui_images(module->dev);
}
}
Expand Down Expand Up @@ -2445,7 +2445,7 @@ static void _raster_value_changed_callback(GtkWidget *widget, struct dt_iop_modu

if(reprocess)
{
dt_dev_invalidate_all(module->dev);
dt_dev_invalidate_all(module->dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(module->dev);
}
}
Expand Down
57 changes: 19 additions & 38 deletions src/develop/develop.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,14 +217,12 @@ void dt_dev_pixelpipe_rebuild(dt_develop_t *dev)
dev->pipe->changed |= DT_DEV_PIPE_REMOVE;
dev->preview_pipe->changed |= DT_DEV_PIPE_REMOVE;
dt_pthread_mutex_unlock(&dev->history_mutex);
dt_dev_invalidate_all(dev);
dt_dev_invalidate_all(dev, __FUNCTION__, __FILE__, __LINE__);
}

void dt_dev_invalidate(dt_develop_t *dev)
void dt_dev_invalidate(dt_develop_t *dev, const char *caller, const char *file, const long line)
{
dt_times_t start;
dt_get_times(&start);
dt_show_times(&start, "[dev_process_image] sending killswitch signal on running pipelines");
dt_print(DT_DEBUG_DEV, "[dev_process_image] sending killswitch signal from %s - in %s:%ld\n", caller, file, line);

dt_atomic_set_int(&dev->pipe->shutdown, TRUE);

Expand All @@ -234,11 +232,9 @@ void dt_dev_invalidate(dt_develop_t *dev)
dt_pthread_mutex_unlock(&dev->history_mutex);
}

void dt_dev_invalidate_preview(dt_develop_t *dev)
void dt_dev_invalidate_preview(dt_develop_t *dev, const char *caller, const char *file, const long line)
{
dt_times_t start;
dt_get_times(&start);
dt_show_times(&start, "[dev_process_preview] sending killswitch signal on running pipelines");
dt_print(DT_DEBUG_DEV, "[dev_process_preview] sending killswitch signal from %s - in %s:%ld\n", caller, file, line);

dt_atomic_set_int(&dev->preview_pipe->shutdown, TRUE);

Expand All @@ -248,14 +244,14 @@ void dt_dev_invalidate_preview(dt_develop_t *dev)
dt_pthread_mutex_unlock(&dev->history_mutex);
}

void dt_dev_invalidate_all(dt_develop_t *dev)
void dt_dev_invalidate_all(dt_develop_t *dev, const char *caller, const char *file, const long line)
{
// Send killswitch ASAP
dt_atomic_set_int(&dev->pipe->shutdown, TRUE);
dt_atomic_set_int(&dev->preview_pipe->shutdown, TRUE);

dt_dev_invalidate(dev);
dt_dev_invalidate_preview(dev);
dt_dev_invalidate(dev, caller, file, line);
dt_dev_invalidate_preview(dev, caller, file, line);
}

void dt_dev_process_preview_job(dt_develop_t *dev)
Expand Down Expand Up @@ -528,7 +524,7 @@ static inline void _dt_dev_load_raw(dt_develop_t *dev, const uint32_t imgid)
void dt_dev_reload_image(dt_develop_t *dev, const uint32_t imgid)
{
_dt_dev_load_raw(dev, imgid);
dt_dev_invalidate_all(dev);
dt_dev_invalidate_all(dev, __FUNCTION__, __FILE__, __LINE__);
}

float dt_dev_get_zoom_scale(dt_develop_t *dev, dt_dev_zoom_t zoom, int closeup_factor, int preview)
Expand Down Expand Up @@ -596,8 +592,8 @@ void dt_dev_load_image(dt_develop_t *dev, const uint32_t imgid)

void dt_dev_configure(dt_develop_t *dev, int wd, int ht)
{
// Called only from Darkroom to init drawing size
// fixed border on every side
// Called only from Darkroom to init and update drawing size
// depending on sidebars and main window resizing.
const int32_t tb = dev->border_size;
wd -= 2*tb;
ht -= 2*tb;
Expand All @@ -616,7 +612,7 @@ void dt_dev_configure(dt_develop_t *dev, int wd, int ht)
if(dev->image_storage.id > -1 && darktable.mipmap_cache)
{
// Only if it's not our initial configure call, aka if we already have an image
dt_dev_invalidate(dev);
dt_dev_invalidate(dev, __FUNCTION__, __FILE__, __LINE__);
dt_control_queue_redraw_center();
dt_dev_refresh_ui_images(dev);
}
Expand Down Expand Up @@ -883,9 +879,6 @@ void _dev_add_history_item(dt_develop_t *dev, dt_iop_module_t *module, gboolean

dt_pthread_mutex_unlock(&dev->history_mutex);

// invalidate buffers and force redraw of darkroom
dt_dev_invalidate_all(dev);

if(dev->gui_attached)
{
/* signal that history has changed */
Expand All @@ -902,17 +895,11 @@ void _dev_add_history_item(dt_develop_t *dev, dt_iop_module_t *module, gboolean
void dt_dev_add_history_item(dt_develop_t *dev, dt_iop_module_t *module, gboolean enable)
{
_dev_add_history_item(dev, module, enable, FALSE);
dt_dev_invalidate_all(dev, __FUNCTION__, __FILE__, __LINE__);
dt_control_queue_redraw_center();
dt_dev_refresh_ui_images(dev);
}

void dt_dev_add_new_history_item(dt_develop_t *dev, dt_iop_module_t *module, gboolean enable)
{
_dev_add_history_item(dev, module, enable, TRUE);
dt_control_queue_redraw_center();
dt_dev_refresh_ui_images(darktable.develop);
}

void dt_dev_add_masks_history_item_ext(dt_develop_t *dev, dt_iop_module_t *_module, gboolean _enable, gboolean no_image)
{
dt_iop_module_t *module = _module;
Expand Down Expand Up @@ -963,11 +950,6 @@ void dt_dev_add_masks_history_item(dt_develop_t *dev, dt_iop_module_t *module, g
/* recreate mask list */
dt_dev_masks_list_change(dev);
}

// invalidate buffers and force redraw of darkroom
dt_dev_invalidate_all(dev);
dt_control_queue_redraw_center();
dt_dev_refresh_ui_images(dev);
}

void dt_dev_free_history_item(gpointer data)
Expand Down Expand Up @@ -1040,6 +1022,8 @@ void dt_dev_reload_history_items(dt_develop_t *dev)
dt_dev_modules_update_multishow(dev);

dt_unlock_image(dev->image_storage.id);

dt_dev_invalidate_all(dev, __FUNCTION__, __FILE__, __LINE__);
}

void dt_dev_pop_history_items_ext(dt_develop_t *dev, int32_t cnt)
Expand Down Expand Up @@ -1162,8 +1146,6 @@ void dt_dev_pop_history_items(dt_develop_t *dev, int32_t cnt)

dt_pthread_mutex_unlock(&dev->history_mutex);

dt_dev_invalidate_all(dev);

dt_dev_masks_list_change(dev);
}

Expand Down Expand Up @@ -1949,7 +1931,6 @@ void dt_dev_read_history_ext(dt_develop_t *dev, const int imgid, gboolean no_ima

if(dev->gui_attached && !no_image)
{
dt_dev_invalidate_all(dev);
/* signal history changed */
dt_dev_undo_end_record(dev);
}
Expand Down Expand Up @@ -2002,15 +1983,15 @@ void dt_dev_reprocess_center(dt_develop_t *dev)
// Flush the caches and recompute from scratch
if(darktable.gui->reset || !dev || !dev->gui_attached) return;
dt_dev_pixelpipe_cache_flush(&(dev->pipe->cache));
dt_dev_invalidate(dev);
dt_dev_invalidate(dev, __FUNCTION__, __FILE__, __LINE__);
}

void dt_dev_reprocess_preview(dt_develop_t *dev)
{
// Flush the caches and recompute from scratch
if(darktable.gui->reset || !dev || !dev->gui_attached) return;
dt_dev_pixelpipe_cache_flush(&(dev->preview_pipe->cache));
dt_dev_invalidate_preview(dev);
dt_dev_invalidate_preview(dev, __FUNCTION__, __FILE__, __LINE__);
}

void dt_dev_reprocess_all(dt_develop_t *dev)
Expand Down Expand Up @@ -2626,7 +2607,7 @@ int dt_dev_sync_pixelpipe_hash(dt_develop_t *dev, struct dt_dev_pixelpipe_t *pip
// timed out. let's see if history stack has changed
if(pipe->changed & (DT_DEV_PIPE_TOP_CHANGED | DT_DEV_PIPE_REMOVE | DT_DEV_PIPE_SYNCH))
{
dt_dev_invalidate(dev);
dt_dev_invalidate(dev, __FUNCTION__, __FILE__, __LINE__);
// pretend that everything is fine
return TRUE;
}
Expand Down Expand Up @@ -2723,7 +2704,7 @@ int dt_dev_sync_pixelpipe_hash_distort(dt_develop_t *dev, struct dt_dev_pixelpip
// timed out. let's see if history stack has changed
if(pipe->changed & (DT_DEV_PIPE_TOP_CHANGED | DT_DEV_PIPE_REMOVE | DT_DEV_PIPE_SYNCH))
{
dt_dev_invalidate(dev);
dt_dev_refresh_ui_images(dev);
// pretend that everything is fine
return TRUE;
}
Expand Down
8 changes: 3 additions & 5 deletions src/develop/develop.h
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,6 @@ int dt_dev_is_current_image(dt_develop_t *dev, uint32_t imgid);
const dt_dev_history_item_t *dt_dev_get_history_item(dt_develop_t *dev, const char *op);
void dt_dev_add_history_item_ext(dt_develop_t *dev, struct dt_iop_module_t *module, gboolean enable, gboolean no_image);
void dt_dev_add_history_item(dt_develop_t *dev, struct dt_iop_module_t *module, gboolean enable);
void dt_dev_add_new_history_item(dt_develop_t *dev, struct dt_iop_module_t *module, gboolean enable);
void dt_dev_add_masks_history_item_ext(dt_develop_t *dev, struct dt_iop_module_t *_module, gboolean _enable, gboolean no_image);
void dt_dev_add_masks_history_item(dt_develop_t *dev, struct dt_iop_module_t *_module, gboolean enable);
void dt_dev_reload_history_items(dt_develop_t *dev);
Expand All @@ -354,10 +353,9 @@ void dt_dev_invalidate_history_module(GList *list, struct dt_iop_module_t *modul
// force a rebuild of the pipe, needed when a module order is changed for example
void dt_dev_pixelpipe_rebuild(struct dt_develop_t *dev);

void dt_dev_invalidate(dt_develop_t *dev);
void dt_dev_invalidate_preview(dt_develop_t *dev);
// also invalidates preview (which is unaffected by resize/zoom/pan)
void dt_dev_invalidate_all(dt_develop_t *dev);
void dt_dev_invalidate(dt_develop_t *dev, const char *caller, const char *file, const long line);
void dt_dev_invalidate_preview(dt_develop_t *dev, const char *caller, const char *file, const long line);
void dt_dev_invalidate_all(dt_develop_t *dev, const char *caller, const char *file, const long line);
void dt_dev_set_histogram(dt_develop_t *dev);
void dt_dev_set_histogram_pre(dt_develop_t *dev);
void dt_dev_get_history_item_label(dt_dev_history_item_t *hist, char *label, const int cnt);
Expand Down
4 changes: 2 additions & 2 deletions src/develop/imageop.c
Original file line number Diff line number Diff line change
Expand Up @@ -2861,7 +2861,7 @@ void dt_iop_refresh_center(dt_iop_module_t *module)
dt_develop_t *dev = module->dev;
if (dev && dev->gui_attached)
{
dt_dev_invalidate(dev);
dt_dev_invalidate(dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(dev);
}
}
Expand All @@ -2872,7 +2872,7 @@ void dt_iop_refresh_preview(dt_iop_module_t *module)
dt_develop_t *dev = module->dev;
if (dev && dev->gui_attached)
{
dt_dev_invalidate_preview(dev);
dt_dev_invalidate_preview(dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(dev);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/develop/masks/masks.c
Original file line number Diff line number Diff line change
Expand Up @@ -1977,7 +1977,7 @@ void dt_masks_update_image(dt_develop_t *dev)
// dt_similarity_image_dirty(dev->image_storage.id);

// invalidate buffers and force redraw of darkroom
dt_dev_invalidate_all(dev);
dt_dev_invalidate_all(dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(dev);
}

Expand Down
5 changes: 4 additions & 1 deletion src/develop/pixelpipe_cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,10 @@ void dt_dev_pixelpipe_cache_print(dt_dev_pixelpipe_cache_t *cache)
{
for(int k = 0; k < cache->entries; k++)
{
printf("pixelpipe cacheline %d used %d by %lu\n", k, cache->used[k], cache->hash[k]);
if(cache->hash[k] == (uint64_t)-1)
printf("pixelpipe cacheline %d unused\n", k);
else
printf("pixelpipe cacheline %d used %d by %lu\n", k, cache->used[k], cache->hash[k]);
}
printf("cache hit rate so far: %.3f\n", (cache->queries - cache->misses) / (float)cache->queries);
}
Expand Down
8 changes: 4 additions & 4 deletions src/gui/actions/display.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ static void full_screen_callback()
else
gtk_window_fullscreen(GTK_WINDOW(widget));

dt_dev_invalidate(darktable.develop);
dt_dev_invalidate(darktable.develop, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(darktable.develop);

/* redraw center view */
Expand Down Expand Up @@ -57,7 +57,7 @@ static void _toggle_side_borders_accel_callback(dt_action_t *action)
dt_ui_toggle_panels_visibility(darktable.gui->ui);

/* trigger invalidation of centerview to reprocess pipe */
dt_dev_invalidate(darktable.develop);
dt_dev_invalidate(darktable.develop, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(darktable.develop);
gtk_widget_queue_draw(dt_ui_center(darktable.gui->ui));
}
Expand Down Expand Up @@ -251,7 +251,7 @@ static void profile_callback(GtkWidget *widget)
dt_colorspaces_update_display_transforms();
pthread_rwlock_unlock(&darktable.color_profiles->xprofile_lock);
DT_DEBUG_CONTROL_SIGNAL_RAISE(darktable.signals, DT_SIGNAL_CONTROL_PROFILE_USER_CHANGED, DT_COLORSPACES_PROFILE_TYPE_DISPLAY);
dt_dev_invalidate_all(darktable.develop);
dt_dev_invalidate_all(darktable.develop, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(darktable.develop);
}
}
Expand Down Expand Up @@ -287,7 +287,7 @@ static void intent_callback(GtkWidget *widget)
pthread_rwlock_rdlock(&darktable.color_profiles->xprofile_lock);
dt_colorspaces_update_display_transforms();
pthread_rwlock_unlock(&darktable.color_profiles->xprofile_lock);
dt_dev_invalidate_all(darktable.develop);
dt_dev_invalidate_all(darktable.develop, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(darktable.develop);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/gui/color_picker_proxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ static gboolean _color_picker_callback_button_press(GtkWidget *button, GdkEventB
}
// force applying the next incoming sample
self->changed = TRUE;
dt_dev_invalidate_all(darktable.develop);
dt_dev_invalidate_all(darktable.develop, __FUNCTION__, __FILE__, __LINE__);
}
else
{
Expand Down
6 changes: 3 additions & 3 deletions src/iop/ashift.c
Original file line number Diff line number Diff line change
Expand Up @@ -3035,7 +3035,7 @@ static int _do_get_structure_auto(dt_iop_module_t *module, dt_iop_ashift_params_
dt_control_log(_("data pending - please repeat"));
// force to reprocess the preview, otherwise the buffer is ko
dt_dev_pixelpipe_flush_caches(module->dev->preview_pipe);
dt_dev_invalidate_preview(module->dev);
dt_dev_invalidate_preview(module->dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(module->dev);
goto error;
}
Expand Down Expand Up @@ -3086,7 +3086,7 @@ static void _do_get_structure_lines(dt_iop_module_t *self)
dt_control_log(_("data pending - please repeat"));
// force to reprocess the preview, otherwise the buffer is ko
dt_dev_pixelpipe_flush_caches(self->dev->preview_pipe);
dt_dev_invalidate_preview(self->dev);
dt_dev_invalidate_preview(self->dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(self->dev);
return;
}
Expand Down Expand Up @@ -3133,7 +3133,7 @@ static void _do_get_structure_quad(dt_iop_module_t *self)
dt_control_log(_("data pending - please repeat"));
// force to reprocess the preview, otherwise the buffer is ko
dt_dev_pixelpipe_flush_caches(self->dev->preview_pipe);
dt_dev_invalidate_preview(self->dev);
dt_dev_invalidate_preview(self->dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(self->dev);
return;
}
Expand Down
4 changes: 2 additions & 2 deletions src/iop/basicadj.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ static void _auto_levels_callback(GtkButton *button, dt_iop_module_t *self)
}
dt_iop_gui_leave_critical_section(self);

dt_dev_invalidate_all(self->dev);
dt_dev_invalidate_all(self->dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(self->dev);
}

Expand Down Expand Up @@ -355,7 +355,7 @@ int button_released(struct dt_iop_module_t *self, double x, double y, int which,
g->button_down = 0;
g->call_auto_exposure = 1;

dt_dev_invalidate_all(self->dev);
dt_dev_invalidate_all(self->dev, __FUNCTION__, __FILE__, __LINE__);
dt_dev_refresh_ui_images(self->dev);
}
else
Expand Down
Loading

0 comments on commit 786d31c

Please sign in to comment.