Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
pixelpipe_hb.h File Reference
#include "common/atomic.h"
#include "common/image.h"
#include "common/imageio.h"
#include "common/iop_order.h"
#include "develop/imageop.h"
#include "develop/pixelpipe_cache.h"
+ Include dependency graph for pixelpipe_hb.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  dt_dev_pixelpipe_raster_mask_t
 
struct  dt_dev_pixelpipe_iop_t
 
struct  dt_backbuf_t
 
struct  dt_dev_pixelpipe_t
 

Macros

#define dt_dev_pixelpipe_synch_all(pipe, dev)   dt_dev_pixelpipe_synch_all_real(pipe, dev, __FUNCTION__)
 

Typedefs

typedef struct dt_dev_pixelpipe_raster_mask_t dt_dev_pixelpipe_raster_mask_t
 
typedef struct dt_dev_pixelpipe_iop_t dt_dev_pixelpipe_iop_t
 
typedef enum dt_dev_pixelpipe_change_t dt_dev_pixelpipe_change_t
 
typedef enum dt_dev_pixelpipe_status_t dt_dev_pixelpipe_status_t
 
typedef struct dt_backbuf_t dt_backbuf_t
 
typedef struct dt_dev_pixelpipe_t dt_dev_pixelpipe_t
 

Enumerations

enum  dt_dev_pixelpipe_change_t {
  DT_DEV_PIPE_UNCHANGED = 0 ,
  DT_DEV_PIPE_TOP_CHANGED = 1 << 0 ,
  DT_DEV_PIPE_REMOVE = 1 << 1 ,
  DT_DEV_PIPE_SYNCH = 1 << 2 ,
  DT_DEV_PIPE_ZOOMED = 1 << 3
}
 
enum  dt_dev_pixelpipe_status_t {
  DT_DEV_PIXELPIPE_DIRTY = 0 ,
  DT_DEV_PIXELPIPE_UNDEF = 1 ,
  DT_DEV_PIXELPIPE_VALID = 2 ,
  DT_DEV_PIXELPIPE_INVALID = 3
}
 

Functions

static uint64_t dt_dev_backbuf_get_hash (const dt_backbuf_t *backbuf)
 
static void dt_dev_backbuf_set_hash (dt_backbuf_t *backbuf, const uint64_t hash)
 
static uint64_t dt_dev_backbuf_get_history_hash (const dt_backbuf_t *backbuf)
 
static void dt_dev_backbuf_set_history_hash (dt_backbuf_t *backbuf, const uint64_t history_hash)
 
static uint64_t dt_dev_pixelpipe_get_hash (const 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_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)
 
static dt_dev_pixelpipe_change_t dt_dev_pixelpipe_get_changed (const dt_dev_pixelpipe_t *pipe)
 
static void dt_dev_pixelpipe_set_changed (dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_change_t v)
 
static void dt_dev_pixelpipe_or_changed (dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_change_t flags)
 
char * dt_pixelpipe_get_pipe_name (dt_dev_pixelpipe_type_t pipe_type)
 
int dt_dev_pixelpipe_init (dt_dev_pixelpipe_t *pipe)
 
int dt_dev_pixelpipe_init_preview (dt_dev_pixelpipe_t *pipe)
 
int dt_dev_pixelpipe_init_export (dt_dev_pixelpipe_t *pipe, int levels, gboolean store_masks)
 
int dt_dev_pixelpipe_init_thumbnail (dt_dev_pixelpipe_t *pipe)
 
int dt_dev_pixelpipe_init_dummy (dt_dev_pixelpipe_t *pipe)
 
int dt_dev_pixelpipe_init_cached (dt_dev_pixelpipe_t *pipe)
 
void dt_dev_pixelpipe_set_realtime (dt_dev_pixelpipe_t *pipe, gboolean state)
 
gboolean dt_dev_pixelpipe_get_realtime (const dt_dev_pixelpipe_t *pipe)
 
void dt_dev_pixelpipe_set_input (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev, int32_t imgid, int width, int height, dt_mipmap_size_t size)
 
void dt_dev_pixelpipe_set_icc (dt_dev_pixelpipe_t *pipe, dt_colorspaces_color_profile_type_t icc_type, const gchar *icc_filename, dt_iop_color_intent_t icc_intent)
 
void dt_dev_pixelpipe_cleanup (dt_dev_pixelpipe_t *pipe)
 
void dt_dev_pixelpipe_cleanup_nodes (dt_dev_pixelpipe_t *pipe)
 
void dt_dev_pixelpipe_create_nodes (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
 
void dt_dev_pixelpipe_synch_all_real (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev, const char *caller_func)
 Find the last history item matching each pipeline node (module), in the order of pipeline execution. This is super important because modules providing raster masks need to be inited before modules using them, in the order of pipeline nodes. But history holds no guaranty that raster masks providers will be older than raster masks users, especially after history compression. So reading in history order is not an option.
 
void dt_dev_pixelpipe_synch_top (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
 
int dt_dev_pixelpipe_process (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev, dt_iop_roi_t roi)
 
void dt_dev_pixelpipe_disable_after (dt_dev_pixelpipe_t *pipe, const char *op)
 
void dt_dev_pixelpipe_disable_before (dt_dev_pixelpipe_t *pipe, const char *op)
 
float * dt_dev_get_raster_mask (dt_dev_pixelpipe_t *pipe, const struct dt_iop_module_t *raster_mask_source, const int raster_mask_id, const struct dt_iop_module_t *target_module, gboolean *free_mask, int *error)
 
void dt_dev_clear_rawdetail_mask (dt_dev_pixelpipe_t *pipe)
 
gboolean dt_dev_write_rawdetail_mask (const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, float *const rgb, const dt_iop_roi_t *const roi_in, const int mode)
 
float * dt_dev_distort_detail_mask (const dt_dev_pixelpipe_t *pipe, float *src, const struct dt_iop_module_t *target_module)
 
gboolean dt_dev_pixelpipe_set_reentry (dt_dev_pixelpipe_t *pipe, uint64_t hash)
 Set the re-entry pipeline flag, only if no object is already capturing it. Re-entered pipelines run with cache disabled, but without flushing the whole cache. This was designed for cases where raster masks references are lost on pipeline, for example when going to lighttable and re-entering darkroom (pipe caches are not flushed for performance, if re-entering the same image), as to trigger a full pipe run and reinit references.
 
gboolean dt_dev_pixelpipe_unset_reentry (dt_dev_pixelpipe_t *pipe, uint64_t hash)
 Remove the re-entry pipeline flag, only if the object identifier is the one that set it. See dt_dev_pixelpipe_set_reentry.
 
gboolean dt_dev_pixelpipe_has_reentry (dt_dev_pixelpipe_t *pipe)
 
void dt_dev_pixelpipe_reset_reentry (dt_dev_pixelpipe_t *pipe)
 

Macro Definition Documentation

◆ dt_dev_pixelpipe_synch_all

#define dt_dev_pixelpipe_synch_all (   pipe,
  dev 
)    dt_dev_pixelpipe_synch_all_real(pipe, dev, __FUNCTION__)

Typedef Documentation

◆ dt_backbuf_t

typedef struct dt_backbuf_t dt_backbuf_t

this encapsulates the pixelpipe. a develop module will need several of these: for previews and full blits to cairo and for the export function.

◆ dt_dev_pixelpipe_change_t

◆ dt_dev_pixelpipe_iop_t

Runtime representation of one history item instantiated inside a pixelpipe node.

A piece is the sealed processing contract for one module on one pipe. It is authored during history -> pipe synchronization and then consumed by the recursive runtime without recomputing its format contract.

Contract sealing order:

  • the upstream descriptor is copied into #dsc_in,
  • module input_format() may overwrite the fields it requires on #dsc_in,
  • the resulting hard storage contract is sanitized against the actual upstream storage format; only bit depth, channel count, and RAW filter layout must match,
  • #dsc_out is initialized from #dsc_in,
  • commit_params() may update value-domain metadata that depends on module parameters, such as processed_maximum or RAW normalization coefficients,
  • module output_format() may finally overwrite the output storage contract.

After synchronization:

  • #dsc_in and #dsc_out are authoritative and immutable during process(), process_cl(), process_tiling(), and blending,
  • runtime code may compare the previous piece output descriptor with #dsc_in to decide whether a colorspace conversion is needed, but it must not rewrite the contract,
  • ROI callbacks (modify_roi_in() / modify_roi_out()) are still allowed to mutate the piece because ROI planning happens before processing starts and some modules derive descriptor details from the planned crop,
  • cache entries published by this piece inherit the descriptor of the pixels produced by this stage, namely #dsc_out.

Mutable lifecycle summary:

  • commit_params(), input_format(), output_format(), and ROI planning are the only places allowed to author the contract,
  • processing code treats the piece as read-only,
  • the cache-related fields only track output ownership/reuse hints and do not participate in the pixel format contract itself.

◆ dt_dev_pixelpipe_raster_mask_t

◆ dt_dev_pixelpipe_status_t

◆ dt_dev_pixelpipe_t

Enumeration Type Documentation

◆ dt_dev_pixelpipe_change_t

Enumerator
DT_DEV_PIPE_UNCHANGED 
DT_DEV_PIPE_TOP_CHANGED 
DT_DEV_PIPE_REMOVE 
DT_DEV_PIPE_SYNCH 
DT_DEV_PIPE_ZOOMED 

◆ dt_dev_pixelpipe_status_t

Enumerator
DT_DEV_PIXELPIPE_DIRTY 
DT_DEV_PIXELPIPE_UNDEF 
DT_DEV_PIXELPIPE_VALID 
DT_DEV_PIXELPIPE_INVALID 

Function Documentation

◆ dt_dev_backbuf_get_hash()

◆ dt_dev_backbuf_get_history_hash()

static uint64_t dt_dev_backbuf_get_history_hash ( const dt_backbuf_t backbuf)
inlinestatic

◆ dt_dev_backbuf_set_hash()

static void dt_dev_backbuf_set_hash ( dt_backbuf_t backbuf,
const uint64_t  hash 
)
inlinestatic

◆ dt_dev_backbuf_set_history_hash()

static void dt_dev_backbuf_set_history_hash ( dt_backbuf_t backbuf,
const uint64_t  history_hash 
)
inlinestatic

◆ dt_dev_clear_rawdetail_mask()

◆ dt_dev_distort_detail_mask()

float * dt_dev_distort_detail_mask ( const dt_dev_pixelpipe_t pipe,
float *  src,
const struct dt_iop_module_t target_module 
)

◆ dt_dev_get_raster_mask()

float * dt_dev_get_raster_mask ( dt_dev_pixelpipe_t pipe,
const struct dt_iop_module_t raster_mask_source,
const int  raster_mask_id,
const struct dt_iop_module_t target_module,
gboolean *  free_mask,
int *  error 
)

◆ dt_dev_pixelpipe_cleanup()

◆ dt_dev_pixelpipe_cleanup_nodes()

◆ dt_dev_pixelpipe_create_nodes()

◆ dt_dev_pixelpipe_disable_after()

void dt_dev_pixelpipe_disable_after ( dt_dev_pixelpipe_t pipe,
const char *  op 
)

◆ dt_dev_pixelpipe_disable_before()

void dt_dev_pixelpipe_disable_before ( dt_dev_pixelpipe_t pipe,
const char *  op 
)

◆ dt_dev_pixelpipe_get_changed()

◆ dt_dev_pixelpipe_get_hash()

◆ dt_dev_pixelpipe_get_history_hash()

◆ dt_dev_pixelpipe_get_realtime()

◆ dt_dev_pixelpipe_has_reentry()

gboolean dt_dev_pixelpipe_has_reentry ( dt_dev_pixelpipe_t pipe)

◆ dt_dev_pixelpipe_init()

◆ dt_dev_pixelpipe_init_cached()

◆ dt_dev_pixelpipe_init_dummy()

◆ dt_dev_pixelpipe_init_export()

◆ dt_dev_pixelpipe_init_preview()

◆ dt_dev_pixelpipe_init_thumbnail()

◆ dt_dev_pixelpipe_or_changed()

static void dt_dev_pixelpipe_or_changed ( dt_dev_pixelpipe_t pipe,
const dt_dev_pixelpipe_change_t  flags 
)
inlinestatic

◆ dt_dev_pixelpipe_process()

int dt_dev_pixelpipe_process ( dt_dev_pixelpipe_t pipe,
struct dt_develop_t dev,
dt_iop_roi_t  roi 
)

References _print_opencl_errors(), _requests_cache(), _update_backbuf_cache_reference(), dt_dev_pixelpipe_t::backbuf, dt_develop_t::color_picker, darktable, dt_dev_pixelpipe_t::devid, dt_atomic_get_int(), dt_capabilities_remove(), DT_DEBUG_DEV, DT_DEBUG_MEMORY, DT_DEBUG_OPENCL, dt_dev_backbuf_get_hash(), dt_dev_pixelpipe_cache_peek(), dt_dev_pixelpipe_cache_print(), dt_dev_pixelpipe_cache_unref_hash(), DT_DEV_PIXELPIPE_DISPLAY_NONE, dt_dev_pixelpipe_get_hash(), dt_dev_pixelpipe_get_history_hash(), dt_dev_pixelpipe_get_roi_in(), dt_dev_pixelpipe_process_rec(), dt_free, dt_get_times(), dt_masks_dup_forms_deep(), dt_masks_free_form(), dt_opencl_check_tuning(), dt_opencl_events_flush(), dt_opencl_events_reset(), dt_opencl_lock_device(), DT_OPENCL_MAX_ERRORS, dt_opencl_unlock_device(), dt_opencl_update_settings(), DT_PIXELPIPE_CACHE_HASH_INVALID, dt_pixelpipe_get_global_hash(), dt_pixelpipe_get_pipe_name(), dt_print(), dt_print_mem_usage(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_pthread_rwlock_rdlock, dt_pthread_rwlock_unlock, dt_show_times(), dt_opencl_t::error_count, FALSE, dt_dev_pixelpipe_t::flush_cache, dt_develop_t::forms, dt_dev_pixelpipe_t::forms, dt_develop_t::gui_attached, dt_iop_roi_t::height, dt_develop_t::iop, KILL_SWITCH_PIPE, dt_dev_pixelpipe_t::mask_display, dt_develop_t::masks_mutex, dt_dev_pixelpipe_t::nodes, darktable_t::opencl, dt_dev_pixelpipe_t::opencl_enabled, dt_dev_pixelpipe_t::opencl_error, dt_develop_t::pending_module, dt_develop_t::pending_pipe, dt_develop_t::piece_hash, darktable_t::pipeline_threadsafe, darktable_t::pixelpipe_cache, dt_dev_pixelpipe_t::shutdown, dt_opencl_t::stopped, TRUE, dt_dev_pixelpipe_t::type, darktable_t::unmuted, void(), and dt_iop_roi_t::width.

Referenced by dt_dev_darkroom_pipeline(), and dt_imageio_export_with_flags().

◆ dt_dev_pixelpipe_reset_reentry()

◆ dt_dev_pixelpipe_set_changed()

static void dt_dev_pixelpipe_set_changed ( dt_dev_pixelpipe_t pipe,
const dt_dev_pixelpipe_change_t  v 
)
inlinestatic

◆ dt_dev_pixelpipe_set_hash()

static void dt_dev_pixelpipe_set_hash ( dt_dev_pixelpipe_t pipe,
const uint64_t  hash 
)
inlinestatic

◆ dt_dev_pixelpipe_set_history_hash()

static void dt_dev_pixelpipe_set_history_hash ( dt_dev_pixelpipe_t pipe,
const uint64_t  history_hash 
)
inlinestatic

◆ dt_dev_pixelpipe_set_icc()

void dt_dev_pixelpipe_set_icc ( dt_dev_pixelpipe_t pipe,
dt_colorspaces_color_profile_type_t  icc_type,
const gchar *  icc_filename,
dt_iop_color_intent_t  icc_intent 
)

◆ dt_dev_pixelpipe_set_input()

◆ dt_dev_pixelpipe_set_realtime()

◆ dt_dev_pixelpipe_set_reentry()

gboolean dt_dev_pixelpipe_set_reentry ( dt_dev_pixelpipe_t pipe,
uint64_t  hash 
)

Set the re-entry pipeline flag, only if no object is already capturing it. Re-entered pipelines run with cache disabled, but without flushing the whole cache. This was designed for cases where raster masks references are lost on pipeline, for example when going to lighttable and re-entering darkroom (pipe caches are not flushed for performance, if re-entering the same image), as to trigger a full pipe run and reinit references.

It can be used for any case where a full pipeline recompute is needed once, based on runtime module requirements, but a full cache flush would be overkill.

NOTE: in main darkroom pipe, the coordinates of the ROI can change between runs from the same thread.

Parameters
pipe
hashUnique ID of the object attempting capture the re-entry flag. This should stay constant between 2 pipeline runs from the same thread.
Returns
gboolean TRUE if the object could capture the flag

References DT_DEBUG_DEV, DT_PIXELPIPE_CACHE_HASH_INVALID, dt_print(), FALSE, dt_dev_pixelpipe_t::reentry, dt_dev_pixelpipe_t::reentry_hash, and TRUE.

Referenced by dt_dev_get_raster_mask().

◆ dt_dev_pixelpipe_synch_all_real()

void dt_dev_pixelpipe_synch_all_real ( dt_dev_pixelpipe_t pipe,
dt_develop_t dev,
const char *  caller_func 
)

Find the last history item matching each pipeline node (module), in the order of pipeline execution. This is super important because modules providing raster masks need to be inited before modules using them, in the order of pipeline nodes. But history holds no guaranty that raster masks providers will be older than raster masks users, especially after history compression. So reading in history order is not an option.

Parameters
pipe
dev
caller_func

References _get_debug_pipe_name(), _sync_pipe_nodes_from_history(), DT_DEBUG_DEV, dt_dev_get_history_end_ext(), dt_dev_get_history_hash(), dt_dev_pixelpipe_set_history_hash(), DT_PIXELPIPE_CACHE_HASH_INVALID, dt_print(), dt_dev_history_item_t::hash, dt_develop_t::history, dt_dev_pixelpipe_t::last_history_hash, dt_dev_pixelpipe_t::last_history_item, and type.

◆ dt_dev_pixelpipe_synch_top()

◆ dt_dev_pixelpipe_unset_reentry()

gboolean dt_dev_pixelpipe_unset_reentry ( dt_dev_pixelpipe_t pipe,
uint64_t  hash 
)

Remove the re-entry pipeline flag, only if the object identifier is the one that set it. See dt_dev_pixelpipe_set_reentry.

Parameters
pipe
hashUnique ID of the object attempting capture the re-entry flag. This should stay constant between 2 pipeline runs from the same thread.
Returns
gboolean TRUE if the object could capture the flag

References DT_DEBUG_DEV, DT_PIXELPIPE_CACHE_HASH_INVALID, dt_print(), FALSE, dt_dev_pixelpipe_t::reentry, dt_dev_pixelpipe_t::reentry_hash, and TRUE.

Referenced by dt_dev_get_raster_mask().

◆ dt_dev_write_rawdetail_mask()

◆ dt_pixelpipe_get_pipe_name()