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)   dt_dev_pixelpipe_synch_all_real(pipe, __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_cache_request_t dt_dev_pixelpipe_cache_request_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 ,
  DT_DEV_PIPE_CACHE_REQUEST = 1 << 4
}
 
enum  dt_dev_pixelpipe_cache_request_t {
  DT_DEV_PIXELPIPE_CACHE_REQUEST_NONE = 0 ,
  DT_DEV_PIXELPIPE_CACHE_REQUEST_BACKBUF = 1 ,
  DT_DEV_PIXELPIPE_CACHE_REQUEST_MODULE = 2
}
 

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)
 
static dt_dev_pixelpipe_cache_request_t dt_dev_pixelpipe_get_cache_request (const dt_dev_pixelpipe_t *pipe)
 
static const struct dt_iop_module_tdt_dev_pixelpipe_get_cache_request_module (const dt_dev_pixelpipe_t *pipe)
 
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)
 
static void dt_dev_pixelpipe_reset_cache_request (dt_dev_pixelpipe_t *pipe)
 
char * dt_pixelpipe_get_pipe_name (dt_dev_pixelpipe_type_t pipe_type)
 
int dt_dev_pixelpipe_init (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
 
int dt_dev_pixelpipe_init_preview (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
 
int dt_dev_pixelpipe_init_export (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev, int levels, gboolean store_masks)
 
int dt_dev_pixelpipe_init_thumbnail (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
 
int dt_dev_pixelpipe_init_dummy (dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
 
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)
 
static gboolean dt_dev_pixelpipe_has_shutdown (const dt_dev_pixelpipe_t *pipe)
 
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)
 
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)
 
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. 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)
 
int dt_dev_pixelpipe_process (dt_dev_pixelpipe_t *pipe, 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)
 
float * dt_dev_distort_detail_mask (const dt_dev_pixelpipe_t *pipe, float *src, const struct dt_iop_module_t *target_module)
 
float * dt_dev_retrieve_rawdetail_mask (const dt_dev_pixelpipe_t *pipe, 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)    dt_dev_pixelpipe_synch_all_real(pipe, __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_cache_request_t

◆ 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_t

Enumeration Type Documentation

◆ dt_dev_pixelpipe_cache_request_t

Enumerator
DT_DEV_PIXELPIPE_CACHE_REQUEST_NONE 
DT_DEV_PIXELPIPE_CACHE_REQUEST_BACKBUF 
DT_DEV_PIXELPIPE_CACHE_REQUEST_MODULE 

◆ 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_PIPE_CACHE_REQUEST 

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_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_cache_request()

static dt_dev_pixelpipe_cache_request_t dt_dev_pixelpipe_get_cache_request ( const dt_dev_pixelpipe_t pipe)
inlinestatic

◆ dt_dev_pixelpipe_get_cache_request_module()

static const struct dt_iop_module_t * dt_dev_pixelpipe_get_cache_request_module ( const dt_dev_pixelpipe_t pipe)
inlinestatic

◆ dt_dev_pixelpipe_get_changed()

static dt_dev_pixelpipe_change_t dt_dev_pixelpipe_get_changed ( const dt_dev_pixelpipe_t pipe)
inlinestatic

◆ 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_has_shutdown()

static gboolean dt_dev_pixelpipe_has_shutdown ( const dt_dev_pixelpipe_t pipe)
inlinestatic

◆ 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()

◆ dt_dev_pixelpipe_process()

int dt_dev_pixelpipe_process ( dt_dev_pixelpipe_t pipe,
dt_iop_roi_t  roi 
)

References _bypass_cache(), _get_requested_piece_node(), _print_opencl_errors(), _update_backbuf_cache_reference(), dt_develop_t::color_picker, darktable, dt_dev_pixelpipe_iop_t::data, dt_dev_pixelpipe_t::dev, dt_dev_pixelpipe_t::devid, dt_capabilities_remove(), DT_DEBUG_DEV, DT_DEBUG_MEMORY, DT_DEBUG_OPENCL, dt_dev_pixelpipe_cache_peek(), dt_dev_pixelpipe_cache_print(), DT_DEV_PIXELPIPE_CACHE_REQUEST_MODULE, dt_dev_pixelpipe_cache_unref_hash(), DT_DEV_PIXELPIPE_DISPLAY_NONE, dt_dev_pixelpipe_get_cache_request(), dt_dev_pixelpipe_get_cache_request_module(), dt_dev_pixelpipe_get_hash(), dt_dev_pixelpipe_get_history_hash(), dt_dev_pixelpipe_get_roi_in(), dt_dev_pixelpipe_has_shutdown(), dt_dev_pixelpipe_process_rec(), dt_dev_pixelpipe_reset_cache_request(), 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_dev_pixelpipe_iop_t::global_hash, dt_develop_t::gui_attached, dt_iop_roi_t::height, dt_develop_t::iop, IS_NULL_PTR, KILL_SWITCH_PIPE, dt_dev_pixelpipe_t::mask_display, dt_develop_t::masks_mutex, dt_dev_pixelpipe_t::nodes, dt_iop_module_t::op, 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_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_cache_request()

◆ dt_dev_pixelpipe_reset_reentry()

◆ dt_dev_pixelpipe_set_cache_request()

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 
)
inlinestatic

◆ 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,
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_dev_pixelpipe_t::dev, DT_DEBUG_DEV, dt_dev_get_history_end_ext(), 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_retrieve_rawdetail_mask()

float * dt_dev_retrieve_rawdetail_mask ( const dt_dev_pixelpipe_t pipe,
const struct dt_iop_module_t target_module 
)

◆ dt_pixelpipe_get_pipe_name()