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  dt_drawlayer_worker_t
 Drawlayer worker global state shared with drawlayer module. More...
 
struct  drawlayer_paint_backend_ctx_t
 
struct  drawlayer_rt_thread_ctx_t
 

Macros

#define DRAWLAYER_BATCH_TILE_SIZE   128
 
#define DRAWLAYER_HEARTBEAT_PATCH_NAME   "drawlayer heartbeat patch"
 
#define DRAWLAYER_HEARTBEAT_MASK_NAME   "drawlayer heartbeat stroke mask"
 
#define DRAWLAYER_OUTER_LIVE_BATCH_MULTIPLIER   2u
 

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_paint_backend_ctx_t drawlayer_paint_backend_ctx_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_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 gboolean _process_backend_dab (const dt_drawlayer_brush_dab_t *dab, drawlayer_paint_backend_ctx_t *ctx, const dt_drawlayer_cache_patch_t *sample_patch, dt_drawlayer_cache_patch_t *patch, dt_drawlayer_cache_patch_t *stroke_mask, dt_drawlayer_damaged_rect_t *batch_damage)
 
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 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 guint _worker_batch_min_size (void)
 
static void _log_worker_batch_timing (const char *tag, guint processed_dabs, guint thread_count, double elapsed_ms, gboolean outer_loop)
 
static gboolean _dab_bounds_in_patch (const dt_drawlayer_cache_patch_t *patch, float scale, const dt_drawlayer_brush_dab_t *dab, dt_drawlayer_damaged_rect_t *bounds)
 
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 _stop_worker (dt_iop_module_t *self, dt_drawlayer_worker_t *rt)
 Stop worker thread and clear transient state.
 
static void _stroke_destroy (dt_drawlayer_worker_t *rt)
 Destroy stroke runtime and owned dab window.
 
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 gboolean _collect_batch_bounds (const GArray *dabs, const guint max_dabs, const dt_drawlayer_cache_patch_t *patch, dt_drawlayer_damaged_rect_t *batch_bounds)
 Build the scratch patch bounds that cover the next heartbeat dab batch.
 
static gboolean _ensure_heartbeat_batch_buffers (dt_drawlayer_worker_t *rt, const dt_drawlayer_damaged_rect_t *batch_bounds)
 Ensure worker-private heartbeat scratch buffers match the requested batch bounds.
 
static void _copy_rgba_batch_from_locked_patch (const dt_drawlayer_cache_patch_t *src, dt_drawlayer_cache_patch_t *dst)
 Copy one locked RGBA source region into the heartbeat scratch patch.
 
static void _copy_mask_batch_from_locked_patch (const dt_drawlayer_cache_patch_t *src, dt_drawlayer_cache_patch_t *dst)
 Copy one locked alpha-mask source region into the heartbeat scratch mask.
 
static gboolean _translate_batch_damage (const dt_drawlayer_cache_patch_t *patch, const dt_drawlayer_damaged_rect_t *local_damage, dt_drawlayer_damaged_rect_t *absolute_damage)
 Translate scratch-local damage coordinates back into base-patch coordinates.
 
static void _copy_rgba_damage_to_locked_patch (const dt_drawlayer_cache_patch_t *src, const dt_drawlayer_damaged_rect_t *local_damage, dt_drawlayer_cache_patch_t *dst)
 Copy the written scratch sub-rectangle back into the locked base patch.
 
static void _copy_mask_damage_to_locked_patch (const dt_drawlayer_cache_patch_t *src, const dt_drawlayer_damaged_rect_t *local_damage, dt_drawlayer_cache_patch_t *dst)
 Copy the written scratch mask sub-rectangle back into the locked base stroke mask.
 
static void _clear_rgba_damage_in_patch (dt_drawlayer_cache_patch_t *patch, const dt_drawlayer_damaged_rect_t *local_damage)
 Clear only the flushed RGBA sub-rectangle in the heartbeat scratch patch.
 
static void _clear_mask_damage_in_patch (dt_drawlayer_cache_patch_t *patch, const dt_drawlayer_damaged_rect_t *local_damage)
 Clear only the flushed alpha-mask sub-rectangle in the heartbeat scratch mask.
 
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 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 _workers_any_active_locked (const dt_drawlayer_worker_t *rt)
 Check whether any worker activity remains.
 
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.
 
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)
 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_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 deferred commit request state 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)
 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.
 
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_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 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_HEARTBEAT_MASK_NAME

#define DRAWLAYER_HEARTBEAT_MASK_NAME   "drawlayer heartbeat stroke mask"

◆ DRAWLAYER_HEARTBEAT_PATCH_NAME

#define DRAWLAYER_HEARTBEAT_PATCH_NAME   "drawlayer heartbeat patch"

◆ DRAWLAYER_OUTER_LIVE_BATCH_MULTIPLIER

#define DRAWLAYER_OUTER_LIVE_BATCH_MULTIPLIER   2u

Typedef Documentation

◆ 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

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

static void _cancel_async_commit ( dt_drawlayer_worker_t rt)
static

◆ _clear_mask_damage_in_patch()

static void _clear_mask_damage_in_patch ( dt_drawlayer_cache_patch_t patch,
const dt_drawlayer_damaged_rect_t local_damage 
)
static

◆ _clear_rgba_damage_in_patch()

static void _clear_rgba_damage_in_patch ( dt_drawlayer_cache_patch_t patch,
const dt_drawlayer_damaged_rect_t local_damage 
)
static

◆ _collect_batch_bounds()

static gboolean _collect_batch_bounds ( const GArray *  dabs,
const guint  max_dabs,
const dt_drawlayer_cache_patch_t patch,
dt_drawlayer_damaged_rect_t batch_bounds 
)
static

Build the scratch patch bounds that cover the next heartbeat dab batch.

References _dab_bounds_in_patch(), dt_drawlayer_paint_runtime_note_dab_damage(), FALSE, i, IS_NULL_PTR, and dt_drawlayer_damaged_rect_t::valid.

Referenced by _rasterize_pending_dab_batch().

◆ _copy_mask_batch_from_locked_patch()

static void _copy_mask_batch_from_locked_patch ( const dt_drawlayer_cache_patch_t src,
dt_drawlayer_cache_patch_t dst 
)
static

◆ _copy_mask_damage_to_locked_patch()

◆ _copy_rgba_batch_from_locked_patch()

static void _copy_rgba_batch_from_locked_patch ( const dt_drawlayer_cache_patch_t src,
dt_drawlayer_cache_patch_t dst 
)
static

◆ _copy_rgba_damage_to_locked_patch()

◆ _dab_bounds_in_patch()

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

◆ _enqueue_stroke_end()

◆ _ensure_heartbeat_batch_buffers()

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

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

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

static void _paint_stroke_seed_cb ( void user_data,
uint64_t  stroke_seed 
)
static

◆ _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(), IS_NULL_PTR, state, 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

◆ _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, and param.

Referenced by _drawlayer_worker_main().

◆ _start_worker()

◆ _stop_worker()

◆ _stroke_begin()

◆ _stroke_clear()

◆ _stroke_create()

◆ _stroke_destroy()

◆ _translate_batch_damage()

static gboolean _translate_batch_damage ( const dt_drawlayer_cache_patch_t patch,
const dt_drawlayer_damaged_rect_t local_damage,
dt_drawlayer_damaged_rect_t absolute_damage 
)
static

◆ _wait_worker_idle()

◆ _worker_batch_min_size()

static guint _worker_batch_min_size ( void  )
static

References MAX, and omp_get_max_threads.

Referenced by _rasterize_pending_dab_batch().

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

◆ _workers_any_active_locked()

static gboolean _workers_any_active_locked ( const dt_drawlayer_worker_t rt)
static

Check whether any worker activity remains.

References _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_raw_input_t::have_layer_coords, IS_NULL_PTR, 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, state, 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, and dt_drawlayer_brush_dab_t::x.

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.

References _rt_workers_any_active().

Referenced by _drawlayer_modal_wait_tick(), dt_drawlayer_flush_layer_cache(), 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_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(), IS_NULL_PTR, 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 
)

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(), IS_NULL_PTR, dt_drawlayer_paint_stroke_t::pending_dabs, dt_drawlayer_worker_t::stroke, and dt_drawlayer_worker_t::worker_mutex.

◆ 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(), dt_drawlayer_paint_runtime_note_dab_damage(), g, dt_iop_module_t::gui_data, IS_NULL_PTR, 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.

◆ dt_drawlayer_worker_request_commit()

void dt_drawlayer_worker_request_commit ( dt_drawlayer_worker_t worker)

◆ 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(), IS_NULL_PTR, and dt_drawlayer_worker_t::worker_mutex.

Referenced by dt_drawlayer_commit_dabs().

◆ dt_drawlayer_worker_seal_for_commit()

void dt_drawlayer_worker_seal_for_commit ( dt_drawlayer_worker_t worker)

Seal current stroke for synchronous commit.

References void().

Referenced by dt_drawlayer_commit_dabs().

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

Variable Documentation

◆ _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:1126
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:1176
@ DRAWLAYER_RT_WORKER_BACKEND
Definition worker.c:40
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:1161

Referenced by _drawlayer_worker_main().