Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
worker.c File Reference

Drawlayer realtime worker thread and FIFO event queue. More...

+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  drawlayer_rt_callbacks_t
 Per-worker callback vtable. More...
 
struct  drawlayer_rt_worker_t
 One worker thread runtime including event ring buffer. More...
 
struct  drawlayer_finished_stroke_job_t
 One finished stroke queued for deferred full-resolution replay. More...
 
struct  dt_drawlayer_worker_t
 Drawlayer worker global state shared with drawlayer module. More...
 
struct  drawlayer_paint_backend_ctx_t
 
struct  drawlayer_fullres_replay_scratch_t
 
struct  drawlayer_rt_thread_ctx_t
 

Macros

#define DRAWLAYER_BATCH_TILE_SIZE   128
 
#define DRAWLAYER_OUTER_LIVE_BATCH_MULTIPLIER   2u
 
#define DRAWLAYER_OUTER_FULLRES_BATCH_MULTIPLIER   4u
 

Typedefs

typedef enum drawlayer_rt_worker_kind_t drawlayer_rt_worker_kind_t
 Internal worker slot kinds (currently backend only).
 
typedef void(* drawlayer_rt_sample_cb) (dt_iop_module_t *self, dt_drawlayer_worker_t *rt, const dt_drawlayer_paint_raw_input_t *input)
 Callback signature for one raw-input event processing.
 
typedef void(* drawlayer_rt_stroke_end_cb) (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Callback signature for stroke-end event processing.
 
typedef void(* drawlayer_rt_idle_cb) (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Callback signature for idle transitions inside worker loop.
 
typedef struct drawlayer_rt_callbacks_t drawlayer_rt_callbacks_t
 Per-worker callback vtable.
 
typedef struct drawlayer_rt_worker_t drawlayer_rt_worker_t
 One worker thread runtime including event ring buffer.
 
typedef struct drawlayer_finished_stroke_job_t drawlayer_finished_stroke_job_t
 One finished stroke queued for deferred full-resolution replay.
 
typedef struct drawlayer_paint_backend_ctx_t drawlayer_paint_backend_ctx_t
 
typedef struct drawlayer_fullres_replay_scratch_t drawlayer_fullres_replay_scratch_t
 
typedef struct drawlayer_rt_thread_ctx_t drawlayer_rt_thread_ctx_t
 

Enumerations

enum  drawlayer_rt_worker_kind_t {
  DRAWLAYER_RT_WORKER_BACKEND = 0 ,
  DRAWLAYER_RT_WORKER_COUNT = 1
}
 Internal worker slot kinds (currently backend only). More...
 

Functions

static gboolean _paint_build_dab_cb (void *user_data, dt_drawlayer_paint_stroke_t *state, const dt_drawlayer_paint_raw_input_t *input, dt_drawlayer_brush_dab_t *out_dab)
 
static gboolean _paint_layer_to_widget_cb (void *user_data, float lx, float ly, float *wx, float *wy)
 
static void _paint_emit_backend_dab_cb (void *user_data, const dt_drawlayer_brush_dab_t *dab)
 
static void _paint_emit_noop_cb (void *user_data, const dt_drawlayer_brush_dab_t *dab)
 
static void _paint_stroke_seed_cb (void *user_data, uint64_t stroke_seed)
 
static void _publish_backend_progress (drawlayer_paint_backend_ctx_t *ctx, gboolean flush_pending)
 
static void _process_backend_input (dt_iop_module_t *self, const dt_drawlayer_paint_raw_input_t *input, dt_drawlayer_paint_stroke_t *stroke)
 
static void _process_backend_dab (dt_iop_module_t *self, const dt_drawlayer_brush_dab_t *dab, drawlayer_paint_backend_ctx_t *ctx)
 
static drawlayer_rt_worker_t_backend_worker (dt_drawlayer_worker_t *rt)
 
static const drawlayer_rt_worker_t_backend_worker_const (const dt_drawlayer_worker_t *rt)
 
static gint64 _live_publish_interval_us (void)
 
static gboolean _live_publish_deadline_reached (const dt_drawlayer_worker_t *rt, const gint64 input_ts, const gint64 interval_us)
 
static drawlayer_paint_backend_ctx_t _make_backend_ctx (dt_iop_module_t *self, dt_drawlayer_worker_t *worker, dt_drawlayer_paint_stroke_t *stroke)
 
static guint _rasterize_pending_dab_batch (drawlayer_paint_backend_ctx_t *ctx, gint64 budget_us)
 
static void _drain_queued_raw_inputs_locked (dt_drawlayer_worker_t *worker)
 
static gboolean _rt_queue_pop_locked (dt_drawlayer_worker_t *rt, dt_drawlayer_paint_raw_input_t *event)
 Pop one event from ring queue (lock must be held).
 
static drawlayer_fullres_replay_scratch_t_get_fullres_replay_scratch (void)
 
static float * _ensure_fullres_replay_float_buffer (float **buffer, size_t *capacity_values, size_t needed_values)
 
static guint _worker_batch_min_size (void)
 
static gboolean _dab_batch_supports_outer_loop (const GArray *dabs, guint count)
 
static void _log_worker_batch_timing (const char *tag, guint processed_dabs, guint thread_count, double elapsed_ms, gboolean outer_loop)
 
gboolean dt_drawlayer_build_worker_input_dab (dt_iop_module_t *self, dt_drawlayer_paint_stroke_t *state, const dt_drawlayer_paint_raw_input_t *input, dt_drawlayer_brush_dab_t *dab)
 
void dt_drawlayer_worker_publish_backend_stroke_damage (dt_iop_module_t *self)
 Publish accumulated backend stroke damage into drawlayer process/runtime state.
 
static void _destroy_fullres_replay_scratch (gpointer data)
 
gboolean dt_drawlayer_worker_replay_finished_stroke_to_base_patch (dt_iop_module_t *self, const GArray *raw_inputs)
 Replay one finished stroke into the authoritative base patch from preserved raw inputs.
 
static void _stop_worker (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Stop worker thread and clear transient state.
 
static gboolean _enqueue_finished_stroke (dt_drawlayer_worker_t *rt)
 Queue preserved finished stroke for deferred full-resolution replay (lock must be held).
 
static void _finished_stroke_job_destroy (drawlayer_finished_stroke_job_t *job)
 Destroy one finished-stroke replay job and owned history.
 
static void _stroke_destroy (dt_drawlayer_worker_t *rt)
 Deep-copy preserved stroke history into one deferred replay job.
 
static gboolean _stroke_create (dt_drawlayer_worker_t *rt)
 Create stroke runtime if missing.
 
static gboolean _stroke_begin (dt_drawlayer_worker_t *rt)
 Start new stroke runtime and reset history/path state.
 
static void _stroke_clear (dt_drawlayer_worker_t *rt)
 Clear current stroke state while preserving allocations.
 
static void _reset_backend_path (dt_drawlayer_worker_t *rt)
 
static void _reset_live_publish (dt_drawlayer_worker_t *rt)
 
static void _rt_queue_clear_locked (dt_drawlayer_worker_t *rt)
 Clear queued events (lock must be held).
 
static gboolean _rt_queue_empty (const dt_drawlayer_worker_t *rt)
 Test whether event queue is empty.
 
static gboolean _rt_queue_full (const dt_drawlayer_worker_t *rt)
 Test whether event queue is full.
 
static gboolean _rt_queue_push_locked (dt_drawlayer_worker_t *rt, const dt_drawlayer_paint_raw_input_t *event)
 Push one event in ring queue (lock must be held).
 
static gboolean _worker_is_started (const drawlayer_rt_worker_t *worker)
 
static gboolean _worker_is_busy (const drawlayer_rt_worker_t *worker)
 
static gboolean _worker_pause_requested (const drawlayer_rt_worker_t *worker)
 
static gboolean _backend_pending_dabs_locked (const dt_drawlayer_worker_t *rt)
 
static gboolean _fullres_worker_started (const dt_drawlayer_worker_t *rt)
 
static gboolean _fullres_worker_busy (const dt_drawlayer_worker_t *rt)
 
static void _rt_set_worker_state (dt_drawlayer_worker_t *rt, const dt_drawlayer_worker_state_t state)
 Set worker state atomically under caller synchronization.
 
static void _set_current_thread_realtime_best_effort (void)
 Try elevating current thread scheduling policy for lower-latency input.
 
static gboolean _workers_active_locked (const dt_drawlayer_worker_t *rt)
 Check whether workers still have pending activity (lock must be held).
 
static gboolean _fullres_active_locked (const dt_drawlayer_worker_t *rt)
 Check whether deferred full-resolution replay still has pending activity (lock must be held).
 
static gboolean _workers_any_active_locked (const dt_drawlayer_worker_t *rt)
 Check whether any worker activity remains (backend or deferred replay).
 
static gboolean _workers_ready_for_commit_locked (const dt_drawlayer_worker_t *rt)
 Check if workers are idle and commit can be safely scheduled.
 
static gboolean _rt_workers_active (dt_drawlayer_worker_t *rt)
 Thread-safe wrapper for active-workers status.
 
static gboolean _rt_workers_any_active (dt_drawlayer_worker_t *rt)
 Thread-safe wrapper for any worker activity, including deferred replay.
 
static gboolean _async_commit_idle (gpointer user_data)
 Idle callback committing pending stroke once workers are fully idle.
 
static void _schedule_async_commit_if_ready_locked (dt_drawlayer_worker_t *rt)
 Schedule async commit when lock-state indicates readiness.
 
static void _backend_worker_on_idle (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Backend-worker idle hook.
 
static void _backend_worker_process_sample (dt_iop_module_t *self, dt_drawlayer_worker_t *rt, const dt_drawlayer_paint_raw_input_t *input)
 Process one backend raw input event.
 
static void _backend_worker_process_stroke_end (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Handle backend stroke end: flush, reset, and request commit.
 
static void _rt_destroy_state (dt_iop_module_t *self, dt_drawlayer_worker_t **rt_out)
 Stop and free an existing worker state object.
 
static void _rt_init_state (dt_iop_module_t *self, dt_drawlayer_worker_t **rt_out, gboolean *painting, gboolean *finish_commit_pending, guint *stroke_sample_count, uint32_t *current_stroke_batch, dt_drawlayer_worker_finished_stroke_cb finished_stroke_cb)
 Allocate and initialize worker state object and buffers.
 
static void _rt_cleanup_state (dt_drawlayer_worker_t **rt_out)
 Destroy worker state object and all owned resources.
 
static gboolean _wait_worker_idle (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Wait until worker queue is drained and not busy.
 
static void_drawlayer_fullres_worker_main (void *user_data)
 Deferred full-resolution replay worker main loop.
 
static gboolean _start_fullres_worker (dt_drawlayer_worker_t *rt)
 Start deferred full-resolution replay worker if not running.
 
static void _wait_fullres_idle (dt_drawlayer_worker_t *rt)
 Wait until deferred full-resolution replay queue is drained and idle.
 
static void_drawlayer_worker_main (void *user_data)
 Worker main loop: FIFO dequeue, process, and idle scheduling.
 
static gboolean _start_worker (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Start backend worker thread if not running.
 
static void _cancel_async_commit (dt_drawlayer_worker_t *rt)
 Cancel pending async commit idle callback if any.
 
static void _pause_worker (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Pause worker processing after current callback returns.
 
static void _resume_worker (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Resume worker processing and wake sleeping thread.
 
static gboolean _enqueue_event (dt_iop_module_t *self, dt_drawlayer_worker_t *rt, const dt_drawlayer_paint_raw_input_t *event)
 Generic enqueue helper ensuring worker startup.
 
static gboolean _enqueue_input (dt_iop_module_t *self, dt_drawlayer_worker_t *rt, const dt_drawlayer_paint_raw_input_t *input)
 Enqueue raw input with saturation policy and stroke-abort fallback.
 
static gboolean _enqueue_stroke_end (dt_iop_module_t *self, dt_drawlayer_worker_t *rt, const dt_drawlayer_paint_raw_input_t *input)
 Enqueue explicit stroke-end event (with optional raw release sample).
 
void dt_drawlayer_worker_init (dt_iop_module_t *self, dt_drawlayer_worker_t **worker, gboolean *painting, gboolean *finish_commit_pending, guint *stroke_sample_count, uint32_t *current_stroke_batch, dt_drawlayer_worker_finished_stroke_cb finished_stroke_cb)
 Public worker initialization entry point.
 
void dt_drawlayer_worker_cleanup (dt_drawlayer_worker_t **worker)
 Public worker cleanup entry point.
 
gboolean dt_drawlayer_worker_active (const dt_drawlayer_worker_t *worker)
 Public status query: TRUE when worker has pending activity.
 
gboolean dt_drawlayer_worker_any_active (const dt_drawlayer_worker_t *worker)
 Public status query: TRUE when any worker still has pending activity.
 
gboolean dt_drawlayer_worker_ensure_running (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Ensure realtime/backend worker threads are started.
 
void dt_drawlayer_worker_stop (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Stop realtime and full-resolution worker threads.
 
void dt_drawlayer_worker_get_snapshot (const dt_drawlayer_worker_t *worker, dt_drawlayer_worker_snapshot_t *snapshot)
 Return a thread-safe worker snapshot for runtime scheduling.
 
void dt_drawlayer_worker_request_commit (dt_drawlayer_worker_t *worker)
 Public commit request helper.
 
void dt_drawlayer_worker_flush_pending (dt_drawlayer_worker_t *worker)
 Flush pending backend stroke inputs synchronously.
 
void dt_drawlayer_worker_seal_for_commit (dt_drawlayer_worker_t *worker)
 Seal current stroke for synchronous commit by folding queued raw inputs into preserved history.
 
void dt_drawlayer_worker_flush_finished_strokes (dt_drawlayer_worker_t *worker)
 Wait until deferred full-resolution replay queue becomes idle.
 
void dt_drawlayer_worker_reset_backend_path (dt_drawlayer_worker_t *worker)
 Reset worker-owned backend damage accumulator.
 
void dt_drawlayer_worker_reset_live_publish (dt_drawlayer_worker_t *worker)
 Reset worker-owned transient live-publish state.
 
void dt_drawlayer_worker_reset_stroke (dt_drawlayer_worker_t *worker)
 Clear preserved stroke runtime/history after commit completed.
 
GArray * dt_drawlayer_worker_raw_inputs (dt_drawlayer_worker_t *worker)
 Read-only access to preserved raw input history.
 
dt_drawlayer_paint_stroke_tdt_drawlayer_worker_stroke (dt_drawlayer_worker_t *worker)
 Read-only access to preserved stroke runtime.
 
guint dt_drawlayer_worker_pending_dab_count (const dt_drawlayer_worker_t *worker)
 Return the number of interpolated-but-not-yet-rasterized dabs in the current stroke batch.
 
gboolean dt_drawlayer_worker_finished_stroke_queued (const dt_drawlayer_worker_t *worker)
 Report whether current preserved stroke was already queued for deferred replay.
 
gboolean dt_drawlayer_worker_enqueue_input (dt_drawlayer_worker_t *worker, const dt_drawlayer_paint_raw_input_t *input)
 Public FIFO enqueue for one raw input event.
 
gboolean dt_drawlayer_worker_enqueue_stroke_end (dt_drawlayer_worker_t *worker, const dt_drawlayer_paint_raw_input_t *input)
 Public FIFO enqueue for stroke-end event.
 

Variables

static GPrivate _drawlayer_fullres_replay_scratch_key = G_PRIVATE_INIT(_destroy_fullres_replay_scratch)
 
static const drawlayer_rt_callbacks_t _rt_callbacks [DRAWLAYER_RT_WORKER_COUNT]
 

Detailed Description

Drawlayer realtime worker thread and FIFO event queue.

Macro Definition Documentation

◆ DRAWLAYER_BATCH_TILE_SIZE

#define DRAWLAYER_BATCH_TILE_SIZE   128

◆ DRAWLAYER_OUTER_FULLRES_BATCH_MULTIPLIER

#define DRAWLAYER_OUTER_FULLRES_BATCH_MULTIPLIER   4u

◆ DRAWLAYER_OUTER_LIVE_BATCH_MULTIPLIER

#define DRAWLAYER_OUTER_LIVE_BATCH_MULTIPLIER   2u

Typedef Documentation

◆ drawlayer_finished_stroke_job_t

One finished stroke queued for deferred full-resolution replay.

◆ drawlayer_fullres_replay_scratch_t

◆ drawlayer_paint_backend_ctx_t

◆ drawlayer_rt_callbacks_t

Per-worker callback vtable.

◆ drawlayer_rt_idle_cb

typedef void(* drawlayer_rt_idle_cb) (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)

Callback signature for idle transitions inside worker loop.

◆ drawlayer_rt_sample_cb

typedef void(* drawlayer_rt_sample_cb) (dt_iop_module_t *self, dt_drawlayer_worker_t *rt, const dt_drawlayer_paint_raw_input_t *input)

Callback signature for one raw-input event processing.

◆ drawlayer_rt_stroke_end_cb

typedef void(* drawlayer_rt_stroke_end_cb) (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)

Callback signature for stroke-end event processing.

◆ drawlayer_rt_thread_ctx_t

◆ drawlayer_rt_worker_kind_t

Internal worker slot kinds (currently backend only).

◆ drawlayer_rt_worker_t

One worker thread runtime including event ring buffer.

Enumeration Type Documentation

◆ drawlayer_rt_worker_kind_t

Internal worker slot kinds (currently backend only).

Enumerator
DRAWLAYER_RT_WORKER_BACKEND 
DRAWLAYER_RT_WORKER_COUNT 

Function Documentation

◆ _async_commit_idle()

static gboolean _async_commit_idle ( gpointer  user_data)
static

◆ _backend_pending_dabs_locked()

static gboolean _backend_pending_dabs_locked ( const dt_drawlayer_worker_t rt)
inlinestatic

◆ _backend_worker()

◆ _backend_worker_const()

◆ _backend_worker_on_idle()

◆ _backend_worker_process_sample()

◆ _backend_worker_process_stroke_end()

◆ _cancel_async_commit()

◆ _dab_batch_supports_outer_loop()

static gboolean _dab_batch_supports_outer_loop ( const GArray *  dabs,
guint  count 
)
static

◆ _destroy_fullres_replay_scratch()

◆ _drain_queued_raw_inputs_locked()

static void _drain_queued_raw_inputs_locked ( dt_drawlayer_worker_t worker)
static

◆ _drawlayer_fullres_worker_main()

◆ _drawlayer_worker_main()

◆ _enqueue_event()

static gboolean _enqueue_event ( dt_iop_module_t self,
dt_drawlayer_worker_t rt,
const dt_drawlayer_paint_raw_input_t event 
)
static

◆ _enqueue_finished_stroke()

◆ _enqueue_input()

◆ _enqueue_stroke_end()

static gboolean _enqueue_stroke_end ( dt_iop_module_t self,
dt_drawlayer_worker_t rt,
const dt_drawlayer_paint_raw_input_t input 
)
static

◆ _ensure_fullres_replay_float_buffer()

static float * _ensure_fullres_replay_float_buffer ( float **  buffer,
size_t *  capacity_values,
size_t  needed_values 
)
static

◆ _finished_stroke_job_destroy()

static void _finished_stroke_job_destroy ( drawlayer_finished_stroke_job_t job)
static

Destroy one finished-stroke replay job and owned history.

References dt_free, drawlayer_finished_stroke_job_t::raw_inputs, and TRUE.

Referenced by _drawlayer_fullres_worker_main(), _enqueue_finished_stroke(), and _rt_destroy_state().

◆ _fullres_active_locked()

static gboolean _fullres_active_locked ( const dt_drawlayer_worker_t rt)
static

Check whether deferred full-resolution replay still has pending activity (lock must be held).

References _fullres_worker_busy(), dt_drawlayer_worker_t::finished_stroke_queue, and dt_drawlayer_worker_t::fullres_stop.

Referenced by _workers_any_active_locked().

◆ _fullres_worker_busy()

static gboolean _fullres_worker_busy ( const dt_drawlayer_worker_t rt)
inlinestatic

◆ _fullres_worker_started()

static gboolean _fullres_worker_started ( const dt_drawlayer_worker_t rt)
inlinestatic

◆ _get_fullres_replay_scratch()

◆ _live_publish_deadline_reached()

static gboolean _live_publish_deadline_reached ( const dt_drawlayer_worker_t rt,
const gint64  input_ts,
const gint64  interval_us 
)
inlinestatic

◆ _live_publish_interval_us()

static gint64 _live_publish_interval_us ( void  )
inlinestatic

◆ _log_worker_batch_timing()

static void _log_worker_batch_timing ( const char *  tag,
guint  processed_dabs,
guint  thread_count,
double  elapsed_ms,
gboolean  outer_loop 
)
static

◆ _make_backend_ctx()

◆ _paint_build_dab_cb()

◆ _paint_emit_backend_dab_cb()

static void _paint_emit_backend_dab_cb ( void user_data,
const dt_drawlayer_brush_dab_t dab 
)
static

◆ _paint_emit_noop_cb()

static void _paint_emit_noop_cb ( void user_data,
const dt_drawlayer_brush_dab_t dab 
)
static

◆ _paint_layer_to_widget_cb()

static gboolean _paint_layer_to_widget_cb ( void user_data,
float  lx,
float  ly,
float *  wx,
float *  wy 
)
static

◆ _paint_stroke_seed_cb()

◆ _pause_worker()

◆ _process_backend_dab()

◆ _process_backend_input()

◆ _publish_backend_progress()

◆ _rasterize_pending_dab_batch()

◆ _reset_backend_path()

◆ _reset_live_publish()

◆ _resume_worker()

◆ _rt_cleanup_state()

static void _rt_cleanup_state ( dt_drawlayer_worker_t **  rt_out)
static

Destroy worker state object and all owned resources.

References _rt_destroy_state().

Referenced by dt_drawlayer_worker_cleanup().

◆ _rt_destroy_state()

◆ _rt_init_state()

◆ _rt_queue_clear_locked()

static void _rt_queue_clear_locked ( dt_drawlayer_worker_t rt)
static

◆ _rt_queue_empty()

static gboolean _rt_queue_empty ( const dt_drawlayer_worker_t rt)
static

Test whether event queue is empty.

References _backend_worker_const(), and drawlayer_rt_worker_t::ring_count.

Referenced by _rt_queue_pop_locked().

◆ _rt_queue_full()

static gboolean _rt_queue_full ( const dt_drawlayer_worker_t rt)
static

◆ _rt_queue_pop_locked()

◆ _rt_queue_push_locked()

static gboolean _rt_queue_push_locked ( dt_drawlayer_worker_t rt,
const dt_drawlayer_paint_raw_input_t event 
)
static

◆ _rt_set_worker_state()

static void _rt_set_worker_state ( dt_drawlayer_worker_t rt,
const dt_drawlayer_worker_state_t  state 
)
static

Set worker state atomically under caller synchronization.

References _backend_worker(), and drawlayer_rt_worker_t::state.

Referenced by _drawlayer_worker_main().

◆ _rt_workers_active()

static gboolean _rt_workers_active ( dt_drawlayer_worker_t rt)
static

◆ _rt_workers_any_active()

static gboolean _rt_workers_any_active ( dt_drawlayer_worker_t rt)
static

Thread-safe wrapper for any worker activity, including deferred replay.

References _workers_any_active_locked(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), FALSE, and dt_drawlayer_worker_t::worker_mutex.

Referenced by dt_drawlayer_worker_any_active().

◆ _schedule_async_commit_if_ready_locked()

◆ _set_current_thread_realtime_best_effort()

static void _set_current_thread_realtime_best_effort ( void  )
static

Try elevating current thread scheduling policy for lower-latency input.

References MIN.

Referenced by _drawlayer_worker_main().

◆ _start_fullres_worker()

◆ _start_worker()

◆ _stop_worker()

◆ _stroke_begin()

◆ _stroke_clear()

◆ _stroke_create()

◆ _stroke_destroy()

static void _stroke_destroy ( dt_drawlayer_worker_t rt)
static

Deep-copy preserved stroke history into one deferred replay job.

Destroy stroke runtime and owned dab window.

References dt_drawlayer_paint_stroke_t::dab_window, dt_drawlayer_paint_runtime_private_destroy(), dt_drawlayer_paint_stroke_t::pending_dabs, dt_drawlayer_worker_t::stroke, and TRUE.

Referenced by _rt_destroy_state().

◆ _wait_fullres_idle()

◆ _wait_worker_idle()

◆ _worker_batch_min_size()

static guint _worker_batch_min_size ( void  )
static

◆ _worker_is_busy()

◆ _worker_is_started()

static gboolean _worker_is_started ( const drawlayer_rt_worker_t worker)
inlinestatic

◆ _worker_pause_requested()

static gboolean _worker_pause_requested ( const drawlayer_rt_worker_t worker)
inlinestatic

◆ _workers_active_locked()

static gboolean _workers_active_locked ( const dt_drawlayer_worker_t rt)
static

Check whether workers still have pending activity (lock must be held).

References _backend_worker_const(), _worker_is_busy(), dt_drawlayer_worker_t::finish_commit_pending, and drawlayer_rt_worker_t::ring_count.

Referenced by _rt_workers_active(), and _workers_any_active_locked().

◆ _workers_any_active_locked()

static gboolean _workers_any_active_locked ( const dt_drawlayer_worker_t rt)
static

Check whether any worker activity remains (backend or deferred replay).

References _fullres_active_locked(), and _workers_active_locked().

Referenced by _rt_workers_any_active().

◆ _workers_ready_for_commit_locked()

static gboolean _workers_ready_for_commit_locked ( const dt_drawlayer_worker_t rt)
static

◆ dt_drawlayer_build_worker_input_dab()

gboolean dt_drawlayer_build_worker_input_dab ( dt_iop_module_t self,
dt_drawlayer_paint_stroke_t state,
const dt_drawlayer_paint_raw_input_t input,
dt_drawlayer_brush_dab_t dab 
)

References _clamp01(), _mapping_profile_value(), dt_drawlayer_paint_raw_input_t::accel_profile, dt_drawlayer_paint_raw_input_t::acceleration, dt_drawlayer_paint_raw_input_t::brush_flow, dt_drawlayer_paint_raw_input_t::brush_hardness, dt_drawlayer_paint_raw_input_t::brush_mode, dt_drawlayer_paint_raw_input_t::brush_opacity, dt_drawlayer_paint_raw_input_t::brush_radius, dt_drawlayer_paint_raw_input_t::brush_shape, dt_drawlayer_paint_raw_input_t::brush_sprinkle_coarseness, dt_drawlayer_paint_raw_input_t::brush_sprinkle_size, dt_drawlayer_paint_raw_input_t::brush_sprinkles, dt_drawlayer_paint_raw_input_t::color, dt_drawlayer_paint_raw_input_t::display_color, DRAWLAYER_INPUT_MAP_ACCEL_FLOW, DRAWLAYER_INPUT_MAP_ACCEL_OPACITY, DRAWLAYER_INPUT_MAP_ACCEL_SIZE, DRAWLAYER_INPUT_MAP_ACCEL_SOFTNESS, DRAWLAYER_INPUT_MAP_PRESSURE_FLOW, DRAWLAYER_INPUT_MAP_PRESSURE_OPACITY, DRAWLAYER_INPUT_MAP_PRESSURE_SIZE, DRAWLAYER_INPUT_MAP_PRESSURE_SOFTNESS, DRAWLAYER_INPUT_MAP_TILT_FLOW, DRAWLAYER_INPUT_MAP_TILT_OPACITY, DRAWLAYER_INPUT_MAP_TILT_SIZE, DRAWLAYER_INPUT_MAP_TILT_SOFTNESS, DRAWLAYER_PROFILE_INV_QUADRATIC, DRAWLAYER_PROFILE_LINEAR, DT_DEBUG_INPUT, DT_DRAWLAYER_PAINT_STROKE_MIDDLE, dt_drawlayer_widget_to_layer_coords(), dt_print(), FALSE, dt_drawlayer_paint_stroke_t::have_last_input_dab, dt_drawlayer_paint_raw_input_t::have_layer_coords, dt_drawlayer_paint_stroke_t::history, dt_drawlayer_paint_stroke_t::last_input_dab, dt_drawlayer_paint_raw_input_t::lx, dt_drawlayer_paint_raw_input_t::ly, dt_drawlayer_paint_raw_input_t::map_flags, dt_drawlayer_paint_raw_input_t::pressure, dt_drawlayer_paint_raw_input_t::pressure_profile, dt_drawlayer_paint_raw_input_t::stroke_batch, dt_drawlayer_paint_raw_input_t::stroke_pos, dt_drawlayer_paint_raw_input_t::tilt, dt_drawlayer_paint_raw_input_t::tilt_profile, TRUE, dt_drawlayer_paint_raw_input_t::wx, dt_drawlayer_paint_raw_input_t::wy, dt_drawlayer_brush_dab_t::x, and dt_drawlayer_brush_dab_t::y.

Referenced by _paint_build_dab_cb().

◆ dt_drawlayer_worker_active()

gboolean dt_drawlayer_worker_active ( const dt_drawlayer_worker_t worker)

Public status query: TRUE when worker has pending activity.

Query whether realtime/backend worker still has pending activity.

References _rt_workers_active().

Referenced by dt_drawlayer_begin_gui_stroke_capture().

◆ dt_drawlayer_worker_any_active()

gboolean dt_drawlayer_worker_any_active ( const dt_drawlayer_worker_t worker)

Public status query: TRUE when any worker still has pending activity.

Query whether any worker still has pending activity, including full-resolution replay.

References _rt_workers_any_active().

Referenced by _drawlayer_modal_wait_tick(), dt_drawlayer_build_process_patch_from_base(), dt_drawlayer_flush_layer_cache(), dt_drawlayer_flush_process_patch_to_base(), and dt_drawlayer_wait_for_rasterization_modal().

◆ dt_drawlayer_worker_cleanup()

void dt_drawlayer_worker_cleanup ( dt_drawlayer_worker_t **  worker)

Public worker cleanup entry point.

Stop worker and release all resources.

References _rt_cleanup_state().

Referenced by gui_cleanup().

◆ dt_drawlayer_worker_enqueue_input()

gboolean dt_drawlayer_worker_enqueue_input ( dt_drawlayer_worker_t worker,
const dt_drawlayer_paint_raw_input_t input 
)

Public FIFO enqueue for one raw input event.

Enqueue one raw input event (FIFO, no coalescing).

References _enqueue_input(), and dt_drawlayer_worker_t::self.

Referenced by dt_drawlayer_runtime_manager_update().

◆ dt_drawlayer_worker_enqueue_stroke_end()

gboolean dt_drawlayer_worker_enqueue_stroke_end ( dt_drawlayer_worker_t worker,
const dt_drawlayer_paint_raw_input_t input 
)

Public FIFO enqueue for stroke-end event.

Enqueue stroke-end marker carrying final raw input sample.

References _enqueue_stroke_end(), and dt_drawlayer_worker_t::self.

Referenced by dt_drawlayer_runtime_manager_update().

◆ dt_drawlayer_worker_ensure_running()

gboolean dt_drawlayer_worker_ensure_running ( dt_iop_module_t self,
dt_drawlayer_worker_t rt 
)

Ensure realtime/backend worker threads are started.

References _start_worker().

Referenced by dt_drawlayer_runtime_manager_update().

◆ dt_drawlayer_worker_finished_stroke_queued()

gboolean dt_drawlayer_worker_finished_stroke_queued ( const dt_drawlayer_worker_t worker)

Report whether current preserved stroke was already queued for deferred replay.

Query whether the current preserved stroke has already been handed off for full-resolution replay.

References FALSE, and dt_drawlayer_worker_t::finished_stroke_queued.

Referenced by dt_drawlayer_commit_dabs().

◆ dt_drawlayer_worker_flush_finished_strokes()

void dt_drawlayer_worker_flush_finished_strokes ( dt_drawlayer_worker_t worker)

Wait until deferred full-resolution replay queue becomes idle.

Wait until deferred full-resolution replay queue is idle.

References _wait_fullres_idle().

Referenced by dt_drawlayer_commit_dabs(), dt_drawlayer_flush_layer_cache(), dt_drawlayer_flush_process_patch_to_base(), and dt_drawlayer_runtime_manager_update().

◆ dt_drawlayer_worker_flush_pending()

void dt_drawlayer_worker_flush_pending ( dt_drawlayer_worker_t worker)

Flush pending backend stroke inputs synchronously.

Flush pending events and force commit transition.

References _wait_worker_idle(), and dt_drawlayer_worker_t::self.

◆ dt_drawlayer_worker_get_snapshot()

◆ dt_drawlayer_worker_init()

void dt_drawlayer_worker_init ( dt_iop_module_t self,
dt_drawlayer_worker_t **  worker,
gboolean *  painting,
gboolean *  finish_commit_pending,
guint *  stroke_sample_count,
uint32_t *  current_stroke_batch,
dt_drawlayer_worker_finished_stroke_cb  finished_stroke_cb 
)

Public worker initialization entry point.

Initialize worker and bind external state mirrors.

References _rt_init_state().

Referenced by gui_init().

◆ dt_drawlayer_worker_pending_dab_count()

guint dt_drawlayer_worker_pending_dab_count ( const dt_drawlayer_worker_t worker)

Return the number of interpolated-but-not-yet-rasterized dabs in the current stroke batch.

References dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_drawlayer_paint_stroke_t::pending_dabs, dt_drawlayer_worker_t::stroke, and dt_drawlayer_worker_t::worker_mutex.

Referenced by dt_drawlayer_build_process_patch_from_base().

◆ dt_drawlayer_worker_publish_backend_stroke_damage()

void dt_drawlayer_worker_publish_backend_stroke_damage ( dt_iop_module_t self)

Publish accumulated backend stroke damage into drawlayer process/runtime state.

References dt_drawlayer_paint_merge_runtime_stroke_damage(), g, dt_iop_module_t::gui_data, and TRUE.

Referenced by dt_drawlayer_commit_dabs().

◆ dt_drawlayer_worker_raw_inputs()

GArray * dt_drawlayer_worker_raw_inputs ( dt_drawlayer_worker_t worker)

Read-only access to preserved raw input history.

Read-only access to preserved raw input queue for current stroke (valid only while worker is idle).

References dt_drawlayer_worker_t::stroke_raw_inputs.

Referenced by dt_drawlayer_commit_dabs().

◆ dt_drawlayer_worker_replay_finished_stroke_to_base_patch()

gboolean dt_drawlayer_worker_replay_finished_stroke_to_base_patch ( dt_iop_module_t self,
const GArray *  raw_inputs 
)

Replay one finished stroke into the authoritative base patch from preserved raw inputs.

References _clamp01(), _dab_batch_supports_outer_loop(), _ensure_fullres_replay_float_buffer(), _get_fullres_replay_scratch(), _log_worker_batch_timing(), _paint_build_dab_cb(), _paint_emit_noop_cb(), _paint_layer_to_widget_cb(), _paint_stroke_seed_cb(), _worker_batch_min_size(), dt_drawlayer_paint_callbacks_t::build_dab, dt_drawlayer_paint_stroke_t::dab_window, darktable, dt_drawlayer_paint_stroke_t::distance_percent, DRAWLAYER_OUTER_FULLRES_BATCH_MULTIPLIER, dt_dev_pixelpipe_cache_flush_host_pinned_image(), dt_drawlayer_cache_patch_rdlock(), dt_drawlayer_cache_patch_rdunlock(), dt_drawlayer_cache_patch_wrlock(), dt_drawlayer_cache_patch_wrunlock(), dt_drawlayer_paint_finalize_path(), dt_drawlayer_paint_interpolate_path(), dt_drawlayer_paint_path_state_reset(), dt_drawlayer_paint_queue_raw_input(), dt_drawlayer_paint_raster_path(), dt_drawlayer_paint_runtime_note_dab_damage(), dt_drawlayer_paint_runtime_private_reset(), dt_get_wtime(), dt_iop_nap(), FALSE, g, dt_iop_module_t::gui_data, dt_drawlayer_paint_stroke_t::history, i, MIN, dt_drawlayer_damaged_rect_t::nw, dt_drawlayer_paint_stroke_t::pending_dabs, darktable_t::pixelpipe_cache, dt_drawlayer_brush_dab_t::radius, drawlayer_fullres_replay_scratch_t::replay_pixels, drawlayer_fullres_replay_scratch_t::replay_pixels_capacity, dt_drawlayer_damaged_rect_t::se, drawlayer_paint_backend_ctx_t::self, drawlayer_fullres_replay_scratch_t::stroke, drawlayer_fullres_replay_scratch_t::stroke_mask, drawlayer_fullres_replay_scratch_t::stroke_mask_capacity, TRUE, dt_drawlayer_damaged_rect_t::valid, dt_drawlayer_brush_dab_t::x, dt_drawlayer_cache_patch_t::x, and dt_drawlayer_brush_dab_t::y.

Referenced by dt_drawlayer_commit_dabs(), and gui_init().

◆ dt_drawlayer_worker_request_commit()

◆ dt_drawlayer_worker_reset_backend_path()

void dt_drawlayer_worker_reset_backend_path ( dt_drawlayer_worker_t worker)

◆ dt_drawlayer_worker_reset_live_publish()

void dt_drawlayer_worker_reset_live_publish ( dt_drawlayer_worker_t worker)

◆ dt_drawlayer_worker_reset_stroke()

void dt_drawlayer_worker_reset_stroke ( dt_drawlayer_worker_t worker)

Clear preserved stroke runtime/history after commit completed.

Clear preserved stroke runtime/history after a completed commit.

References _reset_live_publish(), _stroke_clear(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), and dt_drawlayer_worker_t::worker_mutex.

Referenced by dt_drawlayer_commit_dabs().

◆ dt_drawlayer_worker_seal_for_commit()

◆ dt_drawlayer_worker_stop()

void dt_drawlayer_worker_stop ( dt_iop_module_t self,
dt_drawlayer_worker_t rt 
)

Stop realtime and full-resolution worker threads.

References _stop_worker().

Referenced by dt_drawlayer_runtime_manager_update().

◆ dt_drawlayer_worker_stroke()

dt_drawlayer_paint_stroke_t * dt_drawlayer_worker_stroke ( dt_drawlayer_worker_t worker)

Read-only access to preserved stroke runtime.

Read-only access to preserved stroke runtime (valid only while worker is idle).

References dt_drawlayer_worker_t::stroke.

Referenced by dt_drawlayer_commit_dabs().

Variable Documentation

◆ _drawlayer_fullres_replay_scratch_key

GPrivate _drawlayer_fullres_replay_scratch_key = G_PRIVATE_INIT(_destroy_fullres_replay_scratch)
static

◆ _rt_callbacks

static const drawlayer_rt_callbacks_t _rt_callbacks
static
Initial value:
= {
.thread_name = "draw-back",
.process_sample = _backend_worker_process_sample,
.process_stroke_end = _backend_worker_process_stroke_end,
},
}
static void _backend_worker_on_idle(dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
Backend-worker idle hook.
Definition worker.c:1258
static void _backend_worker_process_stroke_end(dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
Handle backend stroke end: flush, reset, and request commit.
Definition worker.c:1291
@ DRAWLAYER_RT_WORKER_BACKEND
Definition worker.c:34
static void _backend_worker_process_sample(dt_iop_module_t *self, dt_drawlayer_worker_t *rt, const dt_drawlayer_paint_raw_input_t *input)
Process one backend raw input event.
Definition worker.c:1276

Referenced by _drawlayer_worker_main().