Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
pixelpipe_hb.h
Go to the documentation of this file.
1/*
2 This file is part of darktable,
3 Copyright (C) 2009-2013 johannes hanika.
4 Copyright (C) 2011 Henrik Andersson.
5 Copyright (C) 2011-2014, 2017 Ulrich Pegelow.
6 Copyright (C) 2012 Richard Wonka.
7 Copyright (C) 2013 Simon Spannagel.
8 Copyright (C) 2014-2016 Roman Lebedev.
9 Copyright (C) 2014, 2016-2017, 2019 Tobias Ellinghaus.
10 Copyright (C) 2016 Pedro Côrte-Real.
11 Copyright (C) 2018-2019 Edgardo Hoszowski.
12 Copyright (C) 2020, 2022-2026 Aurélien PIERRE.
13 Copyright (C) 2020-2021 Pascal Obry.
14 Copyright (C) 2020 Ralf Brown.
15 Copyright (C) 2021-2022 Hanno Schwalm.
16 Copyright (C) 2022 Martin Bařinka.
17
18 darktable is free software: you can redistribute it and/or modify
19 it under the terms of the GNU General Public License as published by
20 the Free Software Foundation, either version 3 of the License, or
21 (at your option) any later version.
22
23 darktable is distributed in the hope that it will be useful,
24 but WITHOUT ANY WARRANTY; without even the implied warranty of
25 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 GNU General Public License for more details.
27
28 You should have received a copy of the GNU General Public License
29 along with darktable. If not, see <http://www.gnu.org/licenses/>.
30*/
31
32#pragma once
33
34#include "common/atomic.h"
35#include "common/image.h"
36#include "common/imageio.h"
37#include "common/iop_order.h"
38#include "develop/imageop.h"
40
41
47struct dt_iop_module_t;
48struct dt_dev_raster_mask_t;
50struct dt_develop_t;
51
53{
54 int id; // 0 is reserved for the reusable masks written in blend.c
55 float *mask;
57
96{
97 struct dt_iop_module_t *module; // the module in the dev operation stack
98 void *data; // to be used by the module to store stuff per pipe piece
99
100 // Memory size of *data upon which we will compute integrity hashes.
101 // This needs to be the size of the constant part of the data structure.
102 // It can even be 0 if nothing relevant to cache integrity hashes is held there.
103 // If the data struct contains pointers, they should go at the end of the struct,
104 // and the size here should be adjusted to only include constant bits, starting at the address of *data.
105 // "Constant" means identical between 2 pipeline nodes init,
106 // because the lifecycle of a pixelpipe cache is longer than that of a pixelpipe itself.
107 // See an example in colorbalancergb.c
108 size_t data_size;
109
110 void *blendop_data; // to be used by the module to store blendop per pipe piece
111 gboolean enabled; // used to disable parts of the pipe for export, independent on module itself.
112 gboolean detail_mask; // TRUE when the piece blend parameters request detail-mask refinement.
113
114 dt_dev_request_flags_t request_histogram; // (bitwise) set if you want an histogram captured
115 dt_dev_histogram_collection_params_t histogram_params; // set histogram generation params
116
117 int iwidth, iheight; // width and height of input buffer
118
119 // Hash representing the current state of the params, blend params and enabled state of this individual module
122
123 // Cumulative hash representing the current module hash and all the upstream modules from the pipeline,
124 // for the current ROI.
126
127 // Same as global hash but for raster masks
129
130 int bpc; // bits per channel, 32 means float
131 dt_iop_roi_t buf_in, buf_out; // theoretical full buffer regions of interest, as passed through modify_roi_out
132 dt_iop_roi_t roi_in, roi_out; // planned runtime regions of interest after backward ROI propagation
133 int process_cl_ready; // set this to 0 in commit_params to temporarily disable the use of process_cl
134 int process_tiling_ready; // set this to 0 in commit_params to temporarily disable tiling
135
136 // Sealed descriptor contract for this module instance.
137 // dsc_in is the module input contract after input_format() sanitized against
138 // the actual upstream storage format.
139 // dsc_out is the authored module output contract after commit_params() and
140 // output_format().
141 // dsc_mask carries the mask-side storage contract when masks are produced.
143
144 // bypass the cache for this module
145 gboolean bypass_cache;
146
147 // Snapshot of the last reusable output cacheline metadata.
148 // This is intentionally NOT used for bypass_cache / no_cache / reentry modes:
149 // - disposable outputs are flagged auto-destroy and must not be rekeyed,
150 // - realtime outputs and GPU-transient outputs can safely reuse their cacheline.
151 // The reused line is rekeyed while still write-locked, and it is destroyed if processing later
152 // fails before producing a valid output for the new hash.
154
155 // Set to TRUE for modules that should mandatorily cache their output to RAM
156 // even when running on OpenCL. This is a processing-policy flag authored
157 // during synchronization and then consumed by one recursion step; it does not
158 // change the descriptor contract.
161
163{
164 DT_DEV_PIPE_UNCHANGED = 0, // no event
165 DT_DEV_PIPE_TOP_CHANGED = 1 << 0, // only params of top element changed
166 DT_DEV_PIPE_REMOVE = 1 << 1, // possibly elements of the pipe have to be removed
168 = 1 << 2, // all nodes up to end need to be synched, but no removal of module pieces is necessary
169 DT_DEV_PIPE_ZOOMED = 1 << 3, // zoom event, preview pipe does not need changes
170 DT_DEV_PIPE_CACHE_REQUEST = 1 << 4, // GUI requested one cacheline to be materialized on host
171 DT_DEV_PIPE_REENTRY = 1 << 5 // retry runtime side-band generation without rebuilding nodes
173
180
187typedef struct dt_backbuf_t
188{
189 size_t bpp; // bits per pixel
190 size_t width; // pixel size of image
191 size_t height; // pixel size of image
192 dt_atomic_uint64 hash; // data checksum/integrity hash, for example to connect to a cacheline
193 dt_atomic_uint64 history_hash; // arbitrary state hash
195
196static inline uint64_t dt_dev_backbuf_get_hash(const dt_backbuf_t *backbuf)
197{
198 return dt_atomic_get_uint64(&backbuf->hash);
199}
200
201static inline void dt_dev_backbuf_set_hash(dt_backbuf_t *backbuf, const uint64_t hash)
202{
203 dt_atomic_set_uint64(&backbuf->hash, hash);
204}
205
207{
208 return dt_atomic_get_uint64(&backbuf->history_hash);
209}
210
211static inline void dt_dev_backbuf_set_history_hash(dt_backbuf_t *backbuf, const uint64_t history_hash)
212{
213 dt_atomic_set_uint64(&backbuf->history_hash, history_hash);
214}
215
216typedef struct dt_dev_pixelpipe_t
217{
218 // The development to which this pipeline is attached
220
221 // input image. Will be fetched directly from mipmap cache
222 int32_t imgid;
224
225 // width and height of full-resolution input buffer
227
228 // Input scaling between full-resolution source image and
229 // actual pipeline mipmap input.
230 // = 1.f, unless we take downscaled RAW for thumbnail export.
231 float iscale;
232
233 // dimensions of processed buffer assuming we take full-resolution input
235
242
243 // instances of pixelpipe, stored in GList of dt_dev_pixelpipe_iop_t
244 GList *nodes;
245 // event flag
247
248 // backbuffer (output)
250
251 // Validity checksum of whole pipeline,
252 // taken as the global hash of the last pipe node (module),
253 // after the last synchronization between dev history and pipe nodes completed.
254 // This is computed in dt_dev_pixelpipe_get_global_hash
255 // ahead of processing image.
256 dt_atomic_uint64 hash;
257
258 // Lock this while a pipeline is working.
259 // This is meant to prevent pipeline destruction/cleanup while it is working.
260 // It should __NEVER__ be used from the GUI thread, the GUI thread interacts
261 // with pipelines __ONLY__ through the pipeline cache.
262 dt_pthread_mutex_t busy_mutex;
263
264 // The hidden detailmask module publishes the full-resolution detail mask in
265 // the global pixelpipe cache under a salted hash derived from its
266 // piece->global_hash. The pipeline keeps only that cache key plus the source
267 // ROI of the published mask so zoom/pan updates can reuse the same payload
268 // exactly like raster masks do.
272
273 // References held on the dedicated global raster-mask cachelines required by
274 // the current graph. Keeping them at pipe level prevents LRU eviction between
275 // provider publication and downstream consumption or mask export.
277
279 // processing is true when actual pixel computations are ongoing
281 // running is true when the pipe thread is running, computing or idle
283 // shutting down?
285 /* Optional caller-owned kill switch used by background thumbnail/surface jobs.
286 * The pipe keeps its own shutdown flag for local teardown, but long-running
287 * non-GUI jobs also need a way to stop as soon as their output target changed
288 * size. Callers own the storage and may flip it from another thread. */
290 // Best-effort processing mode. When TRUE, the processing path bypasses the
291 // early-abort shutdown kill-switch checks that normally stop a stale pipeline
292 // as soon as parameters changed. This allows long-running interactive
293 // pipelines to keep producing "good enough" output until the flag is cleared.
294 // Cleanup/teardown shutdown semantics are unchanged.
296 // opencl enabled for this pixelpipe?
298 // opencl error detected?
300 // running in a tiling context?
302 // should this pixelpipe display a mask in the end?
304 // should this pixelpipe completely suppressed the blendif module?
306 // input data based on this timestamp:
309 // This pipe feeds GUI-side observables such as global histograms and picker
310 // sampling. The processing core reacts to this property instead of branching
311 // on pipeline type.
313 // the final output pixel format this pixelpipe will be converted to
315 // opencl device that has been locked for this pipe.
316 int devid;
317 // last opencl device this pipe ran on, kept after `devid` is reset to -1 at
318 // the end of dt_dev_pixelpipe_process(). Used by dt_dev_pixelpipe_cleanup()
319 // to release only this pipe's own cl_mem cache payloads. -1 if this pipe
320 // never ran on OpenCL.
322 // the user might choose to overwrite the output color space and rendering intent.
326 // snapshot of modules iop_order
328 // snapshot of mask list
329 GList *forms;
330 // Publish every provider mask in the global pixelpipe cache, including masks
331 // which have no downstream consumer but may be requested by export.
333
334 // hash of the last history item synchronized with pipeline
335 // that's because the sync_top option can't assume only one history
336 // item was added since the last synchronization.
338 // pointer identity of the last synchronized history item.
339 // This complements `last_history_hash` for in-place top-entry updates where
340 // the same history node is reused and its hash changes.
342
343 // hash of the whole history stack at the time of synchonization
344 // between pipe and history. This is a local copy of
345 // dev_history_get_hash()
346 dt_atomic_uint64 history_hash;
347 // GUI readers can request one extra host-visible cacheline without pretending
348 // history changed. BACKBUF targets the final pipe output, MODULE targets the
349 // output of cache_request_module.
351 dt_atomic_ptr cache_request_module;
352 // Modules can set this to TRUE internally so the pipeline will
353 // restart right away, in the same thread.
354 // The reentry flag can only be reset (to FALSE) by the same object that captured it.
355 // DO NOT SET THAT DIRECTLY, use the setter/getter functions
356 gboolean reentry;
357
358 // Unique identifier of the object capturing the reentry flag.
359 // This can be a mask or module hash, or anything that stays constant
360 // across 2 pipeline runs from a same thread (aka as long as we don't reinit).
361 // DO NOT SET THAT DIRECTLY, use the setter/getter functions
363
364 // Can be set arbitrarily by pixelpipe modules at runtime
365 // to invalidate downstream module cache lines.
366 // This always gets reset to FALSE when a pipeline finishes,
367 // whether on success or on error.
368 gboolean flush_cache;
369
370 // TRUE if at least one module is bypassing the cache
371 gboolean bypass_cache;
372
373 // If TRUE, do not keep any pixelpipe cache lines around for reuse.
374 // This is intended for one-shot pipelines such as thumbnail exports where caching is pure overhead
375 // and can lead to memory pressure (RAM buffers + OpenCL pinned/device buffers).
376 gboolean no_cache;
377
378 // Temporarily pause the infinite loop of pipeline
379 gboolean pause;
380
381 // Run a self-setting pipeline that will update history for each module
382 // depending on its input if it implements the autoset() method
383 gboolean autoset;
384
386
388{
389 return dt_atomic_get_uint64(&pipe->hash);
390}
391
392static inline void dt_dev_pixelpipe_set_hash(dt_dev_pixelpipe_t *pipe, const uint64_t hash)
393{
394 dt_atomic_set_uint64(&pipe->hash, hash);
395}
396
401
402static inline void dt_dev_pixelpipe_set_history_hash(dt_dev_pixelpipe_t *pipe, const uint64_t history_hash)
403{
404 dt_atomic_set_uint64(&pipe->history_hash, history_hash);
405}
406
411
416
421
427
429{
430 return pipe ? (const struct dt_iop_module_t *)dt_atomic_get_ptr(&pipe->cache_request_module) : NULL;
431}
432
435 const struct dt_iop_module_t *module)
436{
437 if(IS_NULL_PTR(pipe)) return;
438 dt_atomic_set_ptr(&pipe->cache_request_module, (void *)module);
439 dt_atomic_set_int((dt_atomic_int *)&pipe->cache_request, (int)request);
440}
441
448
449struct dt_develop_t;
450
451#ifdef __cplusplus
452extern "C" {
453#endif
454
456
457// inits the pixelpipe with plain passthrough input/output and empty input and default caching settings.
459// inits the preview pixelpipe with plain passthrough input/output and empty input and default caching
460// settings.
462// inits the pixelpipe with settings optimized for full-image export (no history stack cache)
464// inits the pixelpipe with settings optimized for thumbnail export (no history stack cache)
466// inits all but the pixel caches, so you can't actually process an image (just get dimensions and
467// distortions)
469// inits the pixelpipe
471// enable/disable best-effort processing mode, bypassing the usual early-abort
472// shutdown checks while the flag stays enabled.
474// return whether best-effort processing mode is currently enabled.
481// constructs a new input buffer from given RGB float array.
483 int height, float iscale, dt_mipmap_size_t size);
484// set some metadata for colorout to avoid race conditions.
486 const gchar *icc_filename, dt_iop_color_intent_t icc_intent);
487// destroys all allocated data.
489// cleanup all nodes except clean input/output
491// sync with develop_t history stack from scratch (new node added, have to pop old ones)
492// this should be called with dev->history_mutex locked in read mode
494// sync with develop_t history stack by just copying the top item params (same op, new params on top)
496#define dt_dev_pixelpipe_synch_all(pipe) dt_dev_pixelpipe_synch_all_real(pipe, __FUNCTION__)
497// adjust output node according to history stack (history pop event)
499
500// process region of interest of pixels. returns 1 if pipe was altered during processing.
502
503// Refresh GUI samplers from the cachelines already published by a darkroom pipe.
504
505// disable given op and all that comes after it in the pipe:
507// disable given op and all that comes before it in the pipe:
509
518float *dt_dev_get_raster_mask(dt_dev_pixelpipe_t *pipe, const struct dt_iop_module_t *raster_mask_source,
519 const int raster_mask_id, const struct dt_iop_module_t *target_module,
520 int *error);
521
522// helper function writing the pipe-processed ctmask data to dest
525
526
548
559
560// check if pipeline should re-entry after it completes
562
563// Force-reset pipeline re-entry flag, for example if we lost the unique ID of the object
564// in a re-entry loop.
566
567#ifdef __cplusplus
568}
569#endif
570
571// clang-format off
572// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
573// vim: shiftwidth=2 expandtab tabstop=2 cindent
574// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
575// clang-format on
static void error(char *msg)
Definition ashift_lsd.c:202
void dt_atomic_set_int(dt_atomic_int *var, int value)
int dt_atomic_get_int(dt_atomic_int *var)
uint64_t dt_atomic_get_uint64(const dt_atomic_uint64 *var)
void dt_atomic_set_uint64(dt_atomic_uint64 *var, uint64_t value)
void dt_atomic_or_int(dt_atomic_int *var, int flags)
static void * dt_atomic_get_ptr(const dt_atomic_ptr *var)
Definition atomic.h:74
atomic_int dt_atomic_int
Definition atomic.h:66
static void dt_atomic_set_ptr(dt_atomic_ptr *var, void *value)
Definition atomic.h:73
int levels(struct dt_imageio_module_data_t *data)
Definition avif.c:635
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
dt_iop_color_intent_t
Definition colorspaces.h:63
dt_colorspaces_color_profile_type_t
Definition colorspaces.h:81
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
Definition darktable.h:281
dt_imageio_levels_t
Definition imageio.h:61
const float v
float iscale
Definition mipmap_cache.c:2
size_t size
Definition mipmap_cache.c:3
dt_mipmap_buffer_dsc_flags flags
Definition mipmap_cache.c:4
dt_mipmap_size_t
dt_dev_request_flags_t
Definition pixelpipe.h:46
dt_dev_pixelpipe_type_t
Definition pixelpipe.h:36
Pixelpipe cache for storing intermediate results in the pixelpipe.
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_disable_before(dt_dev_pixelpipe_t *pipe, const char *op)
static dt_dev_pixelpipe_cache_request_t dt_dev_pixelpipe_get_cache_request(const dt_dev_pixelpipe_t *pipe)
int dt_dev_pixelpipe_init_preview(dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
void dt_dev_pixelpipe_synch_top(dt_dev_pixelpipe_t *pipe)
void dt_dev_pixelpipe_reset_reentry(dt_dev_pixelpipe_t *pipe)
static void dt_dev_pixelpipe_set_hash(dt_dev_pixelpipe_t *pipe, const uint64_t hash)
static dt_dev_pixelpipe_change_t dt_dev_pixelpipe_get_changed(const dt_dev_pixelpipe_t *pipe)
int dt_dev_pixelpipe_init_cached(dt_dev_pixelpipe_t *pipe)
gboolean dt_dev_pixelpipe_has_reentry(dt_dev_pixelpipe_t *pipe)
void dt_dev_pixelpipe_disable_after(dt_dev_pixelpipe_t *pipe, const char *op)
static uint64_t dt_dev_backbuf_get_history_hash(const dt_backbuf_t *backbuf)
static const struct dt_iop_module_t * dt_dev_pixelpipe_get_cache_request_module(const dt_dev_pixelpipe_t *pipe)
float * dt_dev_retrieve_rawdetail_mask(const dt_dev_pixelpipe_t *pipe, const struct dt_iop_module_t *target_module)
static uint64_t dt_dev_pixelpipe_get_hash(const dt_dev_pixelpipe_t *pipe)
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, int *error)
Retrieve a provider mask from the global cache and transform it to a consumer.
static void dt_dev_pixelpipe_or_changed(dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_change_t flags)
static void dt_dev_pixelpipe_reset_cache_request(dt_dev_pixelpipe_t *pipe)
gboolean dt_dev_pixelpipe_get_realtime(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)
dt_dev_pixelpipe_change_t
@ DT_DEV_PIPE_REENTRY
@ DT_DEV_PIPE_ZOOMED
@ DT_DEV_PIPE_CACHE_REQUEST
@ DT_DEV_PIPE_SYNCH
@ DT_DEV_PIPE_TOP_CHANGED
@ DT_DEV_PIPE_REMOVE
@ DT_DEV_PIPE_UNCHANGED
static uint64_t dt_dev_pixelpipe_get_history_hash(const dt_dev_pixelpipe_t *pipe)
int dt_dev_pixelpipe_init_thumbnail(dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
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)
static void dt_dev_pixelpipe_set_history_hash(dt_dev_pixelpipe_t *pipe, const uint64_t history_hash)
char * dt_pixelpipe_get_pipe_name(dt_dev_pixelpipe_type_t pipe_type)
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....
static void dt_dev_backbuf_set_hash(dt_backbuf_t *backbuf, const uint64_t hash)
int dt_dev_pixelpipe_init_dummy(dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
void dt_dev_pixelpipe_create_nodes(dt_dev_pixelpipe_t *pipe)
static uint64_t dt_dev_backbuf_get_hash(const dt_backbuf_t *backbuf)
static void dt_dev_backbuf_set_history_hash(dt_backbuf_t *backbuf, const uint64_t history_hash)
dt_dev_pixelpipe_cache_request_t
@ DT_DEV_PIXELPIPE_CACHE_REQUEST_BACKBUF
@ DT_DEV_PIXELPIPE_CACHE_REQUEST_NONE
@ DT_DEV_PIXELPIPE_CACHE_REQUEST_MODULE
void dt_dev_pixelpipe_cleanup(dt_dev_pixelpipe_t *pipe)
static void dt_dev_pixelpipe_set_changed(dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_change_t v)
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....
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(dt_dev_pixelpipe_t *pipe, struct dt_develop_t *dev)
int dt_dev_pixelpipe_process(dt_dev_pixelpipe_t *pipe, dt_iop_roi_t roi)
static gboolean dt_dev_pixelpipe_has_shutdown(const dt_dev_pixelpipe_t *pipe)
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.
void dt_dev_pixelpipe_set_realtime(dt_dev_pixelpipe_t *pipe, gboolean state)
void dt_dev_pixelpipe_cleanup_nodes(dt_dev_pixelpipe_t *pipe)
const float uint32_t state[4]
unsigned __int64 uint64_t
Definition strptime.c:75
dt_atomic_uint64 history_hash
dt_atomic_uint64 hash
dt_iop_buffer_dsc_t dsc_out
dt_dev_request_flags_t request_histogram
dt_iop_buffer_dsc_t dsc_in
dt_pixel_cache_entry_t cache_entry
struct dt_iop_module_t *void * data
dt_dev_histogram_collection_params_t histogram_params
dt_iop_buffer_dsc_t dsc_mask
dt_colorspaces_color_profile_type_t icc_type
struct dt_iop_order_iccprofile_info_t * work_profile_info
struct dt_iop_order_iccprofile_info_t * input_profile_info
gpointer last_history_item
struct dt_iop_order_iccprofile_info_t * output_profile_info
gboolean gui_observable_source
uint64_t last_history_hash
dt_pthread_mutex_t busy_mutex
dt_imageio_levels_t levels
dt_atomic_int realtime
dt_atomic_uint64 history_hash
dt_backbuf_t backbuf
dt_mipmap_size_t size
dt_iop_color_intent_t icc_intent
dt_atomic_uint64 hash
dt_atomic_int shutdown
dt_atomic_int * shutdown_ext
dt_atomic_ptr cache_request_module
dt_dev_pixelpipe_type_t type
dt_atomic_int changed
gboolean store_all_raster_masks
uint64_t rawdetail_mask_hash
struct dt_iop_roi_t rawdetail_mask_roi
GArray * raster_mask_hashes
struct dt_develop_t * dev
dt_atomic_int cache_request
struct dt_develop_t::@17 roi
struct dt_dev_pixelpipe_t * pipe
Definition develop.h:247
Region of interest passed through the pixelpipe.
Definition imageop.h:72