![]() |
Ansel 0.0
A darktable fork - bloat + design vision
|
Pixelpipe cache for storing intermediate results in the pixelpipe. More...
#include "common/memory_arena.h"#include "common/atomic.h"#include "develop/format.h"#include <inttypes.h>#include <glib.h>#include <stddef.h>
Include dependency graph for pixelpipe_cache.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_cache_t |
| struct | dt_pixel_cache_entry_t |
Macros | |
| #define | DT_PIXELPIPE_CACHE_HASH_INVALID ((uint64_t)-1) |
Typedefs | |
| typedef struct dt_dev_pixelpipe_cache_t | dt_dev_pixelpipe_cache_t |
| typedef enum dt_dev_pixelpipe_cache_writable_status_t | dt_dev_pixelpipe_cache_writable_status_t |
| typedef struct dt_pixel_cache_entry_t | dt_pixel_cache_entry_t |
Enumerations | |
| enum | dt_dev_pixelpipe_cache_writable_status_t { DT_DEV_PIXELPIPE_CACHE_WRITABLE_ERROR = -1 , DT_DEV_PIXELPIPE_CACHE_WRITABLE_EXACT_HIT = -2 , DT_DEV_PIXELPIPE_CACHE_WRITABLE_CREATED = 1 , DT_DEV_PIXELPIPE_CACHE_WRITABLE_REKEYED = 2 } |
Functions | |
| dt_dev_pixelpipe_cache_t * | dt_dev_pixelpipe_cache_init (size_t max_memory) |
| void | dt_dev_pixelpipe_cache_cleanup (dt_dev_pixelpipe_cache_t *cache) |
| const char * | dt_pixelpipe_cache_set_current_module (const char *module) |
| Set the current module name for cache diagnostics (thread-local). | |
| struct dt_pixel_cache_entry_t * | dt_dev_pixelpipe_cache_get_entry (dt_dev_pixelpipe_cache_t *cache, const uint64_t hash) |
| Get an internal reference to the cache entry matching hash. If you are going to access this entry more than once, keeping the reference and using it instead of hashes will prevent redundant lookups. | |
| struct dt_pixel_cache_entry_t * | dt_dev_pixelpipe_cache_get_entry_by_data (dt_dev_pixelpipe_cache_t *cache, void *data) |
| int | dt_dev_pixelpipe_cache_get (dt_dev_pixelpipe_cache_t *cache, const uint64_t hash, const size_t size, const char *name, const int id, const gboolean alloc, void **data, struct dt_pixel_cache_entry_t **entry) |
| Get a cache line from the cache. | |
| dt_dev_pixelpipe_cache_writable_status_t | dt_dev_pixelpipe_cache_get_writable (dt_dev_pixelpipe_cache_t *cache, const uint64_t hash, const size_t size, const char *name, const int id, const gboolean alloc, const gboolean allow_rekey_reuse, const struct dt_pixel_cache_entry_t *reuse_hint, void **data, struct dt_pixel_cache_entry_t **entry) |
| Acquire a writable cache line for module output. | |
| void * | dt_dev_pixelpipe_cache_borrow_cl_payload (struct dt_pixel_cache_entry_t *entry, int devid, int width, int height, int bpp) |
| Borrow a cached OpenCL payload attached to a cache entry. | |
| void | dt_dev_pixelpipe_cache_return_cl_payload (struct dt_pixel_cache_entry_t *entry, void *mem) |
| Return a borrowed cached OpenCL payload to its cache entry. | |
| void | dt_dev_pixelpipe_cache_flush_entry_clmem (struct dt_pixel_cache_entry_t *entry) |
| Flush all reusable OpenCL payloads cached on one cache entry. | |
| gboolean | dt_dev_pixelpipe_cache_restore_host_payload (dt_dev_pixelpipe_cache_t *cache, struct dt_pixel_cache_entry_t *entry, int preferred_devid, void **data) |
| Materialize a host payload for a live cache entry from its cached device payload. | |
| void * | dt_dev_pixelpipe_cache_get_pinned_image (dt_dev_pixelpipe_cache_t *cache, void *host_ptr, struct dt_pixel_cache_entry_t *entry_hint, int devid, int width, int height, int bpp, int flags, gboolean *out_reused) |
| Acquire a pinned OpenCL image for a host buffer tracked by the pixelpipe cache. | |
| void | dt_dev_pixelpipe_cache_put_pinned_image (dt_dev_pixelpipe_cache_t *cache, void *host_ptr, struct dt_pixel_cache_entry_t *entry_hint, void **mem) |
Release or cache a pinned OpenCL image acquired with dt_dev_pixelpipe_cache_get_pinned_image(). | |
| gboolean | dt_dev_pixelpipe_cache_flush_host_pinned_image (dt_dev_pixelpipe_cache_t *cache, void *host_ptr, struct dt_pixel_cache_entry_t *entry_hint, int devid) |
| Drop cached pinned OpenCL images associated with a given host buffer. | |
| void * | dt_dev_pixelpipe_cache_get_cl_buffer (int devid, void *host_ptr, const struct dt_iop_roi_t *roi, size_t bpp, struct dt_iop_module_t *module, const char *message, struct dt_pixel_cache_entry_t *entry, gboolean *out_reused, void *keep) |
| Allocate or reuse an OpenCL buffer for one cache entry payload. | |
| void * | dt_dev_pixelpipe_cache_alloc_cl_device_buffer (int devid, const struct dt_iop_roi_t *roi, size_t bpp, const struct dt_iop_module_t *module, const char *message, void *keep) |
| Allocate a temporary device-only OpenCL image, retrying once after cache flush. | |
| void | dt_dev_pixelpipe_cache_release_cl_buffer (void **cl_mem_buffer, struct dt_pixel_cache_entry_t *entry, void *host_ptr, gboolean cache_device) |
| Release or cache an OpenCL image associated with one cache entry. | |
| int | dt_dev_pixelpipe_cache_sync_cl_buffer (int devid, void *host_ptr, void *cl_mem_buffer, const struct dt_iop_roi_t *roi, int cl_mode, size_t bpp, struct dt_iop_module_t *module, const char *message) |
| Synchronize between host memory and a pinned OpenCL image. | |
| float * | dt_dev_pixelpipe_cache_restore_cl_buffer (struct dt_dev_pixelpipe_t *pipe, float *input, void *cl_mem_input, const struct dt_iop_roi_t *roi_in, struct dt_iop_module_t *module, size_t in_bpp, struct dt_pixel_cache_entry_t *input_entry, const char *message) |
| Resynchronize one OpenCL input payload back into its cache-backed host buffer. | |
| int | dt_dev_pixelpipe_cache_prepare_cl_input (struct dt_dev_pixelpipe_t *pipe, struct dt_iop_module_t *module, float *input, void **cl_mem_input, const struct dt_iop_roi_t *roi_in, size_t in_bpp, struct dt_pixel_cache_entry_t *input_entry, struct dt_pixel_cache_entry_t **locked_input_entry, void *keep) |
| Prepare the OpenCL input image corresponding to one cache-backed module input. | |
| struct dt_pixel_cache_entry_t * | dt_dev_pixelpipe_cache_ref_entry_for_host_ptr (dt_dev_pixelpipe_cache_t *cache, void *host_ptr) |
| Resolve and retain the cache entry owning a host pointer. | |
| void * | dt_pixel_cache_entry_get_data (struct dt_pixel_cache_entry_t *entry) |
| size_t | dt_pixel_cache_entry_get_size (struct dt_pixel_cache_entry_t *entry) |
| Peek the size (in bytes) reserved for the host buffer of a cache entry. | |
| void * | dt_pixel_cache_alloc (dt_dev_pixelpipe_cache_t *cache, struct dt_pixel_cache_entry_t *entry) |
Actually allocate the memory buffer attached to the cache entry once you create it with dt_dev_pixelpipe_cache_get(). Sizes and everything are already saved in the entry, and the cache will have the needed space reserved. | |
| void * | dt_pixelpipe_cache_alloc_align_cache_impl (dt_dev_pixelpipe_cache_t *cache, size_t size, int id, const char *name) |
| Allocate aligned memory tracked by the pixelpipe cache. This allows LRU cache entries to be evicted if needed to make room. | |
| void | dt_pixelpipe_cache_free_align_cache (dt_dev_pixelpipe_cache_t *cache, void **mem, const char *message) |
| Free aligned memory allocated with dt_pixelpipe_cache_alloc_align_cache. | |
| gboolean | dt_dev_pixelpipe_cache_peek (dt_dev_pixelpipe_cache_t *cache, const uint64_t hash, void **data, struct dt_pixel_cache_entry_t **entry, const int preferred_devid, void **cl_mem_output) |
| Non-owning lookup of an existing cache line. | |
| void | dt_dev_pixelpipe_cache_flush (dt_dev_pixelpipe_cache_t *cache, const int id) |
| Remove cache lines matching id. Entries locked in read/write or having reference count greater than 0 are not removed. | |
| void | dt_dev_pixelpipe_cache_flush_clmem (dt_dev_pixelpipe_cache_t *cache, const int devid) |
| Release cached OpenCL buffers for a device (-1 for all). | |
| int | dt_dev_pixelpipe_cache_remove (dt_dev_pixelpipe_cache_t *cache, const gboolean force, struct dt_pixel_cache_entry_t *entry) |
| Arbitrarily remove the cache entry matching hash. Entries having a reference count > 0 (inter-thread locked) or being having their read/write lock locked will be ignored. If force is TRUE, we ignore reference count, but not locks. | |
| void | dt_dev_pixelpipe_cache_print (dt_dev_pixelpipe_cache_t *cache) |
| int | dt_dev_pixel_pipe_cache_remove_lru (dt_dev_pixelpipe_cache_t *cache) |
| void | dt_dev_pixelpipe_cache_ref_count_entry (dt_dev_pixelpipe_cache_t *cache, gboolean lock, struct dt_pixel_cache_entry_t *entry) |
| Increase/Decrease the reference count on the cache line as to prevent LRU item removal. This function should be called within a read/write lock-protected section to avoid changing an entry while or after it is deleted in parallel. | |
| void | dt_dev_pixelpipe_cache_wrlock_entry (dt_dev_pixelpipe_cache_t *cache, gboolean lock, struct dt_pixel_cache_entry_t *entry) |
| Lock or release the write lock on the entry. | |
| void | dt_dev_pixelpipe_cache_rdlock_entry (dt_dev_pixelpipe_cache_t *cache, gboolean lock, struct dt_pixel_cache_entry_t *entry) |
| Lock or release the read lock on the entry. | |
| void | dt_dev_pixelpipe_cache_flag_auto_destroy (dt_dev_pixelpipe_cache_t *cache, struct dt_pixel_cache_entry_t *entry) |
Flag the cache entry as "auto_destroy". This is useful for short-lived/disposable cache entries, that won't be needed in the future. These will be freed out of the typical LRU, aged-based garbage collection. The thread that tagged this entry as "auto_destroy" is responsible for freeing it as soon as it is done with it, using dt_dev_pixelpipe_cache_auto_destroy_apply(). If not manually freed this way, the entry will be caught using the generic LRU garbage collection. | |
| void | dt_dev_pixelpipe_cache_auto_destroy_apply (dt_dev_pixelpipe_cache_t *cache, struct dt_pixel_cache_entry_t *entry) |
Free the entry if it has the flag "auto_destroy". See dt_dev_pixelpipe_cache_flag_auto_destroy(). This only removes entries whose reference count already dropped to 0 and whose lock is currently free. Call it right after the final consumer releases its refcount, from the same control flow that flagged the entry for auto-destruction. If another consumer still owns the entry, this becomes a no-op and generic cache eviction or a later explicit retry will reap it once ownership reaches 0. | |
| void | dt_dev_pixelpipe_cache_unref_hash (dt_dev_pixelpipe_cache_t *cache, const uint64_t hash) |
| Find the entry matching hash, and decrease its ref_count if found. | |
| int | dt_dev_pixelpipe_cache_rekey (dt_dev_pixelpipe_cache_t *cache, const uint64_t old_hash, const uint64_t new_hash, struct dt_pixel_cache_entry_t *entry) |
| Change the hash/key of an existing cache line in place, without freeing, reallocating or invalidating the underlying entry. | |
Pixelpipe cache for storing intermediate results in the pixelpipe.
This cache can be used locally (in the pixelpipe) or globally (in the whole app). Current implementation is global, using darktable.pipeline_threadsafe mutex lock to protect cache entries addition/removal accross threads. The mutex lock protects the whole recursive pixelpipe, so no internal locking is needed nor implemented here.
| #define DT_PIXELPIPE_CACHE_HASH_INVALID ((uint64_t)-1) |
| typedef struct dt_dev_pixelpipe_cache_t dt_dev_pixelpipe_cache_t |
| typedef struct dt_pixel_cache_entry_t dt_pixel_cache_entry_t |
| int dt_dev_pixel_pipe_cache_remove_lru | ( | dt_dev_pixelpipe_cache_t * | cache | ) |
remove the least used cache entry
References _non_thread_safe_pixel_pipe_cache_remove_lru(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), error(), and dt_dev_pixelpipe_cache_t::lock.
Referenced by dt_tiling_piece_fits_host_memory().
| void * dt_dev_pixelpipe_cache_alloc_cl_device_buffer | ( | int | devid, |
| const struct dt_iop_roi_t * | roi, | ||
| size_t | bpp, | ||
| const struct dt_iop_module_t * | module, | ||
| const char * | message, | ||
| void * | keep | ||
| ) |
Allocate a temporary device-only OpenCL image, retrying once after cache flush.
| devid | OpenCL device id. |
| roi | Buffer dimensions. |
| bpp | Bytes per pixel. |
| module | Module for debug messages. |
| message | Human-readable allocation context. |
| keep | Optional OpenCL buffer that must not be flushed during retry. |
cl_mem) or NULL on failure. | void dt_dev_pixelpipe_cache_auto_destroy_apply | ( | dt_dev_pixelpipe_cache_t * | cache, |
| struct dt_pixel_cache_entry_t * | entry | ||
| ) |
Free the entry if it has the flag "auto_destroy". See dt_dev_pixelpipe_cache_flag_auto_destroy(). This only removes entries whose reference count already dropped to 0 and whose lock is currently free. Call it right after the final consumer releases its refcount, from the same control flow that flagged the entry for auto-destruction. If another consumer still owns the entry, this becomes a no-op and generic cache eviction or a later explicit retry will reap it once ownership reaches 0.
| cache |
References _pixel_cache_message(), dt_pixel_cache_entry_t::auto_destroy, dt_atomic_get_int(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_pthread_rwlock_trywrlock, dt_pthread_rwlock_unlock, dt_dev_pixelpipe_cache_t::entries, FALSE, dt_pixel_cache_entry_t::hash, IS_NULL_PTR, dt_dev_pixelpipe_cache_t::lock, dt_pixel_cache_entry_t::lock, dt_pixel_cache_entry_t::refcount, and TRUE.
Referenced by _abort_module_shutdown_cleanup(), dt_dev_pixelpipe_cleanup(), and dt_dev_pixelpipe_process_rec().
| void * dt_dev_pixelpipe_cache_borrow_cl_payload | ( | struct dt_pixel_cache_entry_t * | entry, |
| int | devid, | ||
| int | width, | ||
| int | height, | ||
| int | bpp | ||
| ) |
Borrow a cached OpenCL payload attached to a cache entry.
This reopens a cached cl_mem image already tracked by the cache entry and increments its internal borrow counter so cache flush/eviction paths will keep it alive until the caller returns it with dt_dev_pixelpipe_cache_return_cl_payload().
| entry | Cache entry owning the payload. |
| host_ptr | Host pointer key for pinned payloads, or NULL for device-only payloads. |
| devid | OpenCL device id. |
| width | Image width. |
| height | Image height. |
| bpp | Bytes per pixel. |
| flags | Tracked OpenCL flags used when the payload was cached. |
cl_mem, or NULL if no matching cached payload exists. References bpp, dt_pixel_cache_entry_t::cl_mem_list, dt_pixel_cache_entry_t::cl_mem_lock, dt_opencl_get_image_element_size(), dt_opencl_get_image_height(), dt_opencl_get_image_width(), dt_opencl_get_mem_context_id(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), height, and width.
Referenced by pixelpipe_process_on_GPU().
| void dt_dev_pixelpipe_cache_cleanup | ( | dt_dev_pixelpipe_cache_t * | cache | ) |
| void dt_dev_pixelpipe_cache_flag_auto_destroy | ( | dt_dev_pixelpipe_cache_t * | cache, |
| struct dt_pixel_cache_entry_t * | entry | ||
| ) |
Flag the cache entry as "auto_destroy". This is useful for short-lived/disposable cache entries, that won't be needed in the future. These will be freed out of the typical LRU, aged-based garbage collection. The thread that tagged this entry as "auto_destroy" is responsible for freeing it as soon as it is done with it, using dt_dev_pixelpipe_cache_auto_destroy_apply(). If not manually freed this way, the entry will be caught using the generic LRU garbage collection.
| cache |
References _pixel_cache_message(), dt_pixel_cache_entry_t::auto_destroy, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), IS_NULL_PTR, dt_dev_pixelpipe_cache_t::lock, and TRUE.
Referenced by _abort_module_shutdown_cleanup(), dt_dev_pixelpipe_cleanup(), and dt_dev_pixelpipe_process_rec().
| void dt_dev_pixelpipe_cache_flush | ( | dt_dev_pixelpipe_cache_t * | cache, |
| const int | id | ||
| ) |
Remove cache lines matching id. Entries locked in read/write or having reference count greater than 0 are not removed.
| cache | |
| id | ID of the pipeline owning the cache line, or -1 to remove all lines. |
References _for_each_remove(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_dev_pixelpipe_cache_t::entries, and dt_dev_pixelpipe_cache_t::lock.
Referenced by dt_dev_darkroom_pipeline(), and dt_dev_pixelpipe_reset_all().
| void dt_dev_pixelpipe_cache_flush_clmem | ( | dt_dev_pixelpipe_cache_t * | cache, |
| const int | devid | ||
| ) |
Release cached OpenCL buffers for a device (-1 for all).
This is intentionally a lightweight VRAM-pressure/retry helper: it drops cached cl_mem objects without taking per-entry write locks. Realtime paths rely on it to free scratch OpenCL buffers without stalling in-flight renders.
References _cache_entry_clmem_flush_device(), darktable, DT_DEBUG_OPENCL, DT_DEBUG_VERBOSE, dt_opencl_events_wait_for(), dt_print(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_dev_pixelpipe_cache_t::entries, dt_pixel_cache_entry_t::hash, key, dt_dev_pixelpipe_cache_t::lock, darktable_t::unmuted, and value.
Referenced by _dt_opencl_alloc_image2d(), dt_dev_pixelpipe_cleanup(), dt_opencl_alloc_device_buffer_with_flags(), leave(), and pixelpipe_process_on_GPU().
| void dt_dev_pixelpipe_cache_flush_entry_clmem | ( | struct dt_pixel_cache_entry_t * | entry | ) |
Flush all reusable OpenCL payloads cached on one cache entry.
Borrowed payloads are preserved until all borrowers returned them.
| entry | Cache entry whose cached cl_mem payloads should be flushed. |
References dt_pixel_cache_entry_t::cl_mem_list, dt_pixel_cache_entry_t::cl_mem_lock, dt_free, dt_opencl_release_mem_object(), dt_pthread_mutex_lock(), and dt_pthread_mutex_unlock().
Referenced by _free_cache_entry(), dt_dev_pixelpipe_cache_rekey(), and dt_dev_pixelpipe_process_rec().
| gboolean dt_dev_pixelpipe_cache_flush_host_pinned_image | ( | dt_dev_pixelpipe_cache_t * | cache, |
| void * | host_ptr, | ||
| struct dt_pixel_cache_entry_t * | entry_hint, | ||
| int | devid | ||
| ) |
Drop cached pinned OpenCL images associated with a given host buffer.
This is meant for host buffers that remain alive and continue to be mutated by the CPU (for example, privately owned working patches). Reusing a stale CL_MEM_USE_HOST_PTR image for such buffers can hide later host-side edits on some drivers. Flushing the cached pinned images forces the next use to rebind the host storage.
| cache | Pixelpipe cache. |
| host_ptr | Host-backed image data. |
| entry_hint | Optional owning cache entry for regular cache lines, or NULL. |
| devid | Device id to flush, or -1 for all cached devices for that host buffer. |
References _cache_entry_clmem_flush_host_pinned_locked(), _cache_entry_clmem_has_host_pinned_locked(), _cache_entry_for_host_ptr_locked(), dt_dev_pixelpipe_cache_ref_count_entry(), dt_opencl_events_wait_for(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), FALSE, IS_NULL_PTR, dt_dev_pixelpipe_cache_t::lock, and TRUE.
Referenced by _rasterize_pending_dab_batch(), _rekey_shared_base_patch(), dt_dev_pixelpipe_gpu_flush_host_pinned_images(), dt_drawlayer_cache_flush_process_patch_to_base(), and dt_drawlayer_cache_populate_process_patch_from_base().
| int dt_dev_pixelpipe_cache_get | ( | dt_dev_pixelpipe_cache_t * | cache, |
| const uint64_t | hash, | ||
| const size_t | size, | ||
| const char * | name, | ||
| const int | id, | ||
| const gboolean | alloc, | ||
| void ** | data, | ||
| struct dt_pixel_cache_entry_t ** | entry | ||
| ) |
Get a cache line from the cache.
WARNING: This internally increases the reference count, so you have to manually decrease it using dt_dev_pixelpipe_ref_count_entry() once the cache line content has been consumed or it will never be freed.
WARNING: if the cache line was newly allocated, a write lock is put on straight away. You will have to release it from the same calling thread next, to avoid dead locks.
| cache | |
| hash | State checksum of the cache line. |
| size | Buffer size in bytes. |
| name | Name of the cache line (for debugging). |
| id | ID of the pipeline owning the cache line. |
| data | Pointer to the buffer pointer (returned). |
| alloc | Whether or not we should actually alloc the buffer, or simply reserve it. If FALSE use dt_pixel_cache_alloc() when you actually need the buffer. |
| cache_entry | a reference to the cache entry, to be reused later. Can be NULL. The caller doesn't own the data and shouldn't free it. |
References _non_thread_safe_cache_ref_count_entry(), _non_thread_safe_cache_remove(), _non_threadsafe_cache_get_entry(), _pixel_cache_message(), _pixelpipe_cache_create_entry_locked(), _pixelpipe_cache_finalize_entry(), dt_pixel_cache_entry_t::auto_destroy, dt_pixel_cache_entry_t::data, DT_DEBUG_PIPECACHE, dt_dev_pixelpipe_cache_wrlock_entry(), dt_pixel_cache_alloc(), DT_PIXELPIPE_CACHE_HASH_INVALID, dt_print(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_dev_pixelpipe_cache_t::entries, FALSE, dt_dev_pixelpipe_cache_t::hits, dt_pixel_cache_entry_t::hits, IS_NULL_PTR, dt_dev_pixelpipe_cache_t::lock, name, dt_dev_pixelpipe_cache_t::queries, size, and TRUE.
Referenced by dt_drawlayer_cache_patch_alloc_shared(), process(), and process_cl().
| void * dt_dev_pixelpipe_cache_get_cl_buffer | ( | int | devid, |
| void * | host_ptr, | ||
| const struct dt_iop_roi_t * | roi, | ||
| size_t | bpp, | ||
| struct dt_iop_module_t * | module, | ||
| const char * | message, | ||
| struct dt_pixel_cache_entry_t * | entry, | ||
| gboolean * | out_reused, | ||
| void * | keep | ||
| ) |
Allocate or reuse an OpenCL buffer for one cache entry payload.
This is the cache-owned buffer acquisition helper used by the OpenCL pixelpipe backend:
!IS_NULL_PTR(host_ptr), it may reuse or allocate a pinned CL_MEM_USE_HOST_PTR image,IS_NULL_PTR(host_ptr), it may reuse or allocate a device-only scratch image,cl_mem flush and one retry.| devid | OpenCL device id. | |
| host_ptr | Host backing store for pinned images, or NULL for device-only images. | |
| roi | Buffer dimensions. | |
| bpp | Bytes per pixel. | |
| module | Module for debug messages. | |
| message | Human-readable allocation context. | |
| entry | Owning cache entry. | |
| [out] | out_reused | Optional flag set TRUE when the buffer came from cache reuse. |
| keep | Optional OpenCL buffer that must not be flushed during retry. |
cl_mem) or NULL on failure. | struct dt_pixel_cache_entry_t * dt_dev_pixelpipe_cache_get_entry | ( | dt_dev_pixelpipe_cache_t * | cache, |
| const uint64_t | hash | ||
| ) |
Get an internal reference to the cache entry matching hash. If you are going to access this entry more than once, keeping the reference and using it instead of hashes will prevent redundant lookups.
| cache | |
| hash |
References _non_threadsafe_cache_get_entry(), DT_PIXELPIPE_CACHE_HASH_INVALID, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_dev_pixelpipe_cache_t::entries, and dt_dev_pixelpipe_cache_t::lock.
Referenced by _do_get_structure_auto(), _do_get_structure_lines(), _do_get_structure_quad(), dt_dev_pixelpipe_cleanup(), dt_dev_pixelpipe_process_rec(), and dt_dev_retrieve_rawdetail_mask().
| struct dt_pixel_cache_entry_t * dt_dev_pixelpipe_cache_get_entry_by_data | ( | dt_dev_pixelpipe_cache_t * | cache, |
| void * | data | ||
| ) |
| void * dt_dev_pixelpipe_cache_get_pinned_image | ( | dt_dev_pixelpipe_cache_t * | cache, |
| void * | host_ptr, | ||
| struct dt_pixel_cache_entry_t * | entry_hint, | ||
| int | devid, | ||
| int | width, | ||
| int | height, | ||
| int | bpp, | ||
| int | flags, | ||
| gboolean * | out_reused | ||
| ) |
Acquire a pinned OpenCL image for a host buffer tracked by the pixelpipe cache.
This is the public helper for modules that manage their own host buffers but still want the pixelpipe cache to own the reusable pinned cl_mem images. The helper accepts an optional cache-entry hint for normal cache lines. If that hint is NULL, it will try to resolve the host pointer against the cache's privately-owned external allocations.
On reuse, the helper synchronizes host memory to the OpenCL image before returning.
| cache | Pixelpipe cache. | |
| host_ptr | Host-backed image data. | |
| entry_hint | Optional owning cache entry for regular cache lines, or NULL. | |
| devid | OpenCL device id. | |
| width | Image width. | |
| height | Image height. | |
| bpp | Bytes per pixel. | |
| flags | OpenCL allocation flags (must include CL_MEM_USE_HOST_PTR). | |
| [out] | out_reused | Optional flag set TRUE when an existing pinned image was reused. |
cl_mem) or NULL on failure. References _cache_entry_for_host_ptr_locked(), _pixel_cache_clmem_get(), _pixel_cache_clmem_remove(), bpp, DT_DEBUG_OPENCL, dt_opencl_alloc_device_use_host_pointer(), dt_opencl_is_pinned_memory(), dt_opencl_map_image(), dt_opencl_release_mem_object(), dt_opencl_unmap_mem_object(), dt_opencl_use_pinned_memory(), dt_opencl_write_host_to_device(), dt_print(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), FALSE, flags, height, IS_NULL_PTR, dt_dev_pixelpipe_cache_t::lock, TRUE, and width.
Referenced by _blend_layer_over_input_cl(), and _drawlayer_acquire_source_image().
| dt_dev_pixelpipe_cache_writable_status_t dt_dev_pixelpipe_cache_get_writable | ( | dt_dev_pixelpipe_cache_t * | cache, |
| const uint64_t | hash, | ||
| const size_t | size, | ||
| const char * | name, | ||
| const int | id, | ||
| const gboolean | alloc, | ||
| const gboolean | allow_rekey_reuse, | ||
| const struct dt_pixel_cache_entry_t * | reuse_hint, | ||
| void ** | data, | ||
| struct dt_pixel_cache_entry_t ** | entry | ||
| ) |
Acquire a writable cache line for module output.
This is the cache-side companion of pixelpipe output computation. The caller already decided that the published output for hash is not immediately reusable and needs to be overwritten.
The cache then resolves how to provide that writable line:
hash, that hash is already published and must not be overwritten. The caller must exact-hit it instead of recomputing,allow_rekey_reuse is TRUE and reuse_hint still points to a live cacheline with the right size, that old cacheline is rekeyed to hash, write-locked, and returned,In all successful cases:
alloc may materialize the host buffer if requested.The caller must later release the write lock and refcount from the same control flow.
| cache | Pixelpipe cache. | |
| hash | Target output hash for the module output. | |
| size | Required buffer size in bytes. | |
| name | Debug label for the cache line. | |
| id | Owning pipeline id. | |
| alloc | Whether a host buffer must be materialized immediately. | |
| allow_rekey_reuse | Whether the cache may reuse the piece-local cached output line by rekeying it. | |
| reuse_hint | Snapshot of the previously attached piece cacheline metadata, or NULL. | |
| [out] | data | Returned host pointer when available. |
| [out] | entry | Returned cache entry. |
DT_DEV_PIXELPIPE_CACHE_WRITABLE_CREATED when creating a new entry, DT_DEV_PIXELPIPE_CACHE_WRITABLE_REKEYED when rekeying reuse_hint, DT_DEV_PIXELPIPE_CACHE_WRITABLE_EXACT_HIT when a published entry already exists at hash and the caller must exact-hit it, DT_DEV_PIXELPIPE_CACHE_WRITABLE_ERROR on error. | dt_dev_pixelpipe_cache_t * dt_dev_pixelpipe_cache_init | ( | size_t | max_memory | ) |
constructs a new cache with given cache line count (entries) and float buffer entry size in bytes.
| [out] | returns | 0 if fail to allocate mem cache. |
References _free_cache_entry(), dt_dev_pixelpipe_cache_t::arena, dt_dev_pixelpipe_cache_t::current_memory, dt_cache_arena_init(), dt_dev_pixelpipe_cache_flush_old(), dt_free, dt_free_gpointer(), dt_pthread_mutex_destroy(), dt_pthread_mutex_init(), dt_dev_pixelpipe_cache_t::entries, dt_dev_pixelpipe_cache_t::external_entries, garbage_collection, dt_dev_pixelpipe_cache_t::hits, IS_NULL_PTR, dt_dev_pixelpipe_cache_t::lock, dt_dev_pixelpipe_cache_t::max_memory, dt_dev_pixelpipe_cache_t::next_serial, and dt_dev_pixelpipe_cache_t::queries.
Referenced by dt_init().
| gboolean dt_dev_pixelpipe_cache_peek | ( | dt_dev_pixelpipe_cache_t * | cache, |
| const uint64_t | hash, | ||
| void ** | data, | ||
| struct dt_pixel_cache_entry_t ** | entry, | ||
| const int | preferred_devid, | ||
| void ** | cl_mem_output | ||
| ) |
Non-owning lookup of an existing cache line.
This does not create a new cache line and does not change reference counts or entry locks. Callers that need lifetime guarantees must retain the entry explicitly with dt_dev_pixelpipe_cache_ref_count_entry() and/or dt_dev_pixelpipe_cache_rdlock_entry().
If !IS_NULL_PTR(cl_mem_output), the lookup becomes authoritative for exact-hit consumers:
cl_mem_output when requested,References _cache_lookup_existing(), _cache_try_restore_device_payload(), _trace_exact_hit(), dt_pixel_cache_entry_t::auto_destroy, DT_DEBUG_PIPECACHE, dt_dev_pixelpipe_cache_remove(), dt_dev_pixelpipe_cache_restore_host_payload(), dt_pixel_cache_entry_get_data(), DT_PIXELPIPE_CACHE_HASH_INVALID, dt_print(), dt_pthread_rwlock_tryrdlock, dt_pthread_rwlock_unlock, FALSE, IS_NULL_PTR, dt_pixel_cache_entry_t::lock, and TRUE.
Referenced by _develop_cacheline_ready_callback(), _develop_history_resync_callback(), _sync_private_buffer_from_preview_cache(), dt_dev_pixelpipe_cache_peek_gui(), dt_dev_pixelpipe_process(), dt_dev_pixelpipe_process_rec(), dt_dev_resync_mipmap_cache(), dt_dev_retrieve_rawdetail_mask(), dt_imageio_export_with_flags(), and gui_focus().
| int dt_dev_pixelpipe_cache_prepare_cl_input | ( | struct dt_dev_pixelpipe_t * | pipe, |
| struct dt_iop_module_t * | module, | ||
| float * | input, | ||
| void ** | cl_mem_input, | ||
| const struct dt_iop_roi_t * | roi_in, | ||
| size_t | in_bpp, | ||
| struct dt_pixel_cache_entry_t * | input_entry, | ||
| struct dt_pixel_cache_entry_t ** | locked_input_entry, | ||
| void * | keep | ||
| ) |
Prepare the OpenCL input image corresponding to one cache-backed module input.
This centralizes the decision tree for:
| pipe | Current pixelpipe. | |
| module | Module being processed. | |
| input | Host input pointer. | |
| [in,out] | cl_mem_input | OpenCL input image. |
| roi_in | Buffer dimensions. | |
| in_bpp | Bytes per pixel. | |
| input_entry | Owning cache entry. | |
| [out] | locked_input_entry | Returned cache entry that stayed read-locked for zero-copy safety. |
| keep | Optional OpenCL buffer that must not be flushed during retry. |
| void dt_dev_pixelpipe_cache_print | ( | dt_dev_pixelpipe_cache_t * | cache | ) |
print out cache lines/hashes (debug).
References dt_dev_pixelpipe_cache_t::current_memory, darktable, DT_DEBUG_PIPECACHE, dt_print(), dt_dev_pixelpipe_cache_t::entries, dt_dev_pixelpipe_cache_t::hits, dt_dev_pixelpipe_cache_t::max_memory, dt_dev_pixelpipe_cache_t::queries, and darktable_t::unmuted.
Referenced by dt_dev_pixelpipe_process().
| void dt_dev_pixelpipe_cache_put_pinned_image | ( | dt_dev_pixelpipe_cache_t * | cache, |
| void * | host_ptr, | ||
| struct dt_pixel_cache_entry_t * | entry_hint, | ||
| void ** | mem | ||
| ) |
Release or cache a pinned OpenCL image acquired with dt_dev_pixelpipe_cache_get_pinned_image().
If the image is still a host-backed pinned allocation and an owning cache entry can be resolved, it is returned to that cache entry for reuse. Otherwise it is released.
| cache | Pixelpipe cache. | |
| host_ptr | Host-backed image data. | |
| entry_hint | Optional owning cache entry for regular cache lines, or NULL. | |
| [in,out] | mem | Pointer to the cl_mem handle (cleared on return). |
References _pixel_cache_clmem_put(), darktable, DT_DEBUG_OPENCL, DT_DEBUG_VERBOSE, dt_print(), IS_NULL_PTR, state, and darktable_t::unmuted.
Referenced by _blend_layer_over_input_cl().
| void dt_dev_pixelpipe_cache_rdlock_entry | ( | dt_dev_pixelpipe_cache_t * | cache, |
| gboolean | lock, | ||
| struct dt_pixel_cache_entry_t * | entry | ||
| ) |
Lock or release the read lock on the entry.
| cache | |
| lock | TRUE to lock, FALSE to release |
| entry | The cache entry object to lock. |
References _pixel_cache_message(), dt_pthread_rwlock_rdlock, dt_pthread_rwlock_unlock, dt_pixel_cache_entry_t::lock, and TRUE.
Referenced by _build_preview_fallback_surface(), _lib_navigation_draw_callback(), _pixelpipe_pick_from_image(), _process_histogram(), _process_vectorscope(), _process_waveform(), _refresh_preview_cursor_sample(), _refresh_preview_module_histogram_for_hash(), _render_main_locked_surface(), _sample_picker_from_cache(), color_picker_apply(), dt_dev_pixelpipe_cache_prepare_cl_input(), dt_dev_pixelpipe_process_rec(), dt_dev_resync_mipmap_cache(), dt_drawlayer_cache_patch_rdlock(), dt_drawlayer_cache_patch_rdunlock(), dt_imageio_export_with_flags(), dt_iop_autoset_advance(), gui_post_expose(), mouse_moved(), pixelpipe_process_on_CPU(), pixelpipe_process_on_GPU(), scrolled(), and update_histogram().
| void dt_dev_pixelpipe_cache_ref_count_entry | ( | dt_dev_pixelpipe_cache_t * | cache, |
| gboolean | lock, | ||
| struct dt_pixel_cache_entry_t * | entry | ||
| ) |
Increase/Decrease the reference count on the cache line as to prevent LRU item removal. This function should be called within a read/write lock-protected section to avoid changing an entry while or after it is deleted in parallel.
WARNING: cache entries whose reference count is greater than 0 will never be deleted from cache.
| cache | |
| lock | TRUE to lock, FALSE to unlock |
References _non_thread_safe_cache_ref_count_entry(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), and dt_dev_pixelpipe_cache_t::lock.
Referenced by _abort_module_shutdown_cleanup(), _blend_layer_over_input_cl(), _cache_try_rekey_reuse_locked(), _develop_cacheline_ready_callback(), _develop_history_resync_callback(), _refresh_global_histogram_backbuf_for_hash(), _refresh_preview_cursor_sample(), _refresh_preview_module_histogram_for_hash(), _retain_base_patch_loaded_ref(), _retain_base_patch_stroke_ref(), _sample_picker_from_cache(), _sync_private_buffer_from_preview_cache(), _update_backbuf_cache_reference(), color_picker_apply(), dt_dev_pixelpipe_cache_flush_host_pinned_image(), dt_dev_pixelpipe_cache_unref_hash(), dt_dev_pixelpipe_process_rec(), dt_dev_retrieve_rawdetail_mask(), dt_drawlayer_cache_patch_alloc_shared(), dt_drawlayer_cache_patch_clear(), dt_drawlayer_release_all_base_patch_extra_refs(), dt_imageio_export_with_flags(), gui_cleanup(), gui_focus(), gui_post_expose(), invalidate_luminance_cache(), mouse_moved(), scrolled(), and update_histogram().
| struct dt_pixel_cache_entry_t * dt_dev_pixelpipe_cache_ref_entry_for_host_ptr | ( | dt_dev_pixelpipe_cache_t * | cache, |
| void * | host_ptr | ||
| ) |
Resolve and retain the cache entry owning a host pointer.
This helper searches both regular and external pixelpipe cache tables for the entry whose host buffer pointer exactly matches host_ptr.
On success it increments the entry refcount before returning, so callers can safely use the entry across asynchronous OpenCL operations. Release it with: dt_dev_pixelpipe_cache_ref_count_entry(cache, FALSE, entry).
| cache | Pixelpipe cache. |
| host_ptr | Host buffer pointer to resolve. |
References _cache_entry_for_host_ptr_locked(), _non_thread_safe_cache_ref_count_entry(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), IS_NULL_PTR, dt_dev_pixelpipe_cache_t::lock, and TRUE.
Referenced by _blend_layer_over_input_cl(), dt_drawlayer_cache_ensure_mask_buffer(), and dt_drawlayer_cache_ensure_process_patch_buffer().
| int dt_dev_pixelpipe_cache_rekey | ( | dt_dev_pixelpipe_cache_t * | cache, |
| const uint64_t | old_hash, | ||
| const uint64_t | new_hash, | ||
| struct dt_pixel_cache_entry_t * | entry | ||
| ) |
Change the hash/key of an existing cache line in place, without freeing, reallocating or invalidating the underlying entry.
This is useful when a cache line remains the authoritative buffer but the caller needs its identity to follow a new logical snapshot (for example a new module-parameter hash). The entry contents, locks, refcount and storage are preserved; only the hash-table key and entry->hash are updated.
The operation fails if:
new_hash.| cache | |
| old_hash | Current key of the entry. |
| new_hash | Desired new key. |
| entry | Optional direct entry reference. May be NULL. |
References _cache_debug_module_name(), _non_threadsafe_cache_get_entry(), dt_pixel_cache_entry_t::auto_destroy, dt_pixel_cache_entry_t::cl_mem_list, dt_pixel_cache_entry_t::cl_mem_lock, dt_pixel_cache_entry_t::data, dt_atomic_get_int(), DT_DEBUG_PIPECACHE, dt_dev_pixelpipe_cache_flush_entry_clmem(), dt_print(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_dev_pixelpipe_cache_t::entries, dt_pixel_cache_entry_t::hash, IS_NULL_PTR, dt_dev_pixelpipe_cache_t::lock, dt_pixel_cache_entry_t::refcount, and dt_pixel_cache_entry_t::serial.
Referenced by _rekey_shared_base_patch().
| void dt_dev_pixelpipe_cache_release_cl_buffer | ( | void ** | cl_mem_buffer, |
| dt_pixel_cache_entry_t * | cache_entry, | ||
| void * | host_ptr, | ||
| const gboolean | cache_device | ||
| ) |
Release or cache an OpenCL image associated with one cache entry.
Pinned host-backed images and reusable device-only images are returned to the cache entry when possible. Otherwise the OpenCL object is released immediately and any stale cache bookkeeping for it is dropped.
| [in,out] | cl_mem_buffer | Pointer to the cl_mem handle. Cleared on return. |
| entry | Owning cache entry, or NULL when the buffer is not cache-backed. | |
| host_ptr | Host pointer backing pinned images, or NULL for device-only images. | |
| cache_device | Whether device-only images may be kept for reuse. |
Release or cache an OpenCL image associated with one cache entry.
| [in,out] | cl_mem_buffer | Pointer to a cl_mem stored as void*. |
| cache_entry | Pixelpipe cache entry the host pointer belongs to (may be NULL). | |
| host_ptr | Host pointer backing the OpenCL image (may be NULL). | |
| cache_device | Allow caching pure device-side buffers for scratch reuse. |
This helper is a single point of truth for OpenCL image lifetime management in the pixelpipe:
CL_MEM_USE_HOST_PTR) and we have both cache_entry and host_ptr, we put it in the cache entry's cl_mem_list for reuse.cl_mem objects are later evicted, the cache layer is responsible for materializing host RAM first if no authoritative host buffer exists yet.Additionally, when we release an image, we must ensure there is no stale pointer in cl_mem_list (for example, if some earlier path cached it and we are now deciding to free it). We call _pixel_cache_clmem_remove() before releasing to keep the cache bookkeeping coherent.
References _pixel_cache_clmem_put(), _pixel_cache_clmem_remove(), dt_opencl_release_mem_object(), and IS_NULL_PTR.
Referenced by _abort_module_shutdown_cleanup(), _blend_layer_over_input_cl(), _drawlayer_acquire_source_image(), _gpu_early_cpu_fallback_if_unsupported(), and pixelpipe_process_on_GPU().
| int dt_dev_pixelpipe_cache_remove | ( | dt_dev_pixelpipe_cache_t * | cache, |
| const gboolean | force, | ||
| struct dt_pixel_cache_entry_t * | entry | ||
| ) |
Arbitrarily remove the cache entry matching hash. Entries having a reference count > 0 (inter-thread locked) or being having their read/write lock locked will be ignored. If force is TRUE, we ignore reference count, but not locks.
| cache | |
| force |
References _non_thread_safe_cache_remove(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_dev_pixelpipe_cache_t::entries, error(), and dt_dev_pixelpipe_cache_t::lock.
Referenced by _abort_module_shutdown_cleanup(), _do_get_structure_auto(), _do_get_structure_lines(), _do_get_structure_quad(), dt_dev_pixelpipe_cache_peek(), dt_dev_pixelpipe_process_rec(), process(), and process_cl().
| float * dt_dev_pixelpipe_cache_restore_cl_buffer | ( | struct dt_dev_pixelpipe_t * | pipe, |
| float * | input, | ||
| void * | cl_mem_input, | ||
| const struct dt_iop_roi_t * | roi_in, | ||
| struct dt_iop_module_t * | module, | ||
| size_t | in_bpp, | ||
| struct dt_pixel_cache_entry_t * | input_entry, | ||
| const char * | message | ||
| ) |
Resynchronize one OpenCL input payload back into its cache-backed host buffer.
| pipe | Current pixelpipe. |
| input | Host cache buffer. |
| cl_mem_input | OpenCL image holding the authoritative pixels. |
| roi_in | Buffer dimensions. |
| module | Module for debug logs. |
| in_bpp | Bytes per pixel. |
| input_entry | Owning cache entry. |
| message | Human-readable sync context. |
input on success, NULL on failure. | gboolean dt_dev_pixelpipe_cache_restore_host_payload | ( | dt_dev_pixelpipe_cache_t * | cache, |
| struct dt_pixel_cache_entry_t * | entry, | ||
| int | preferred_devid, | ||
| void ** | data | ||
| ) |
Materialize a host payload for a live cache entry from its cached device payload.
Recursive pixelpipe stages reopen transient upstream cache entries directly, before those entries become valid exact-hits. When such an entry only carries a GPU payload, the caller may still need a host pointer for CPU fallback or for a non-OpenCL module. This helper keeps the recovery local to the cache layer:
entry when needed,data.The function leaves the cache entry owned by the caller. It does not change refcounts.
| cache | Pixelpipe cache. | |
| entry | Live cache entry to restore. | |
| preferred_devid | Preferred OpenCL device id, or -1 for any. | |
| [out] | data | Restored host pointer, or NULL on failure. |
References _cache_entry_materialize_host_data(), dt_pixel_cache_entry_get_data(), FALSE, IS_NULL_PTR, and TRUE.
Referenced by dt_dev_pixelpipe_cache_peek().
| void dt_dev_pixelpipe_cache_return_cl_payload | ( | struct dt_pixel_cache_entry_t * | entry, |
| void * | mem | ||
| ) |
Return a borrowed cached OpenCL payload to its cache entry.
| entry | Cache entry owning the payload. |
| mem | Borrowed cl_mem to release back to cache bookkeeping. |
References dt_pixel_cache_entry_t::cl_mem_list, dt_pixel_cache_entry_t::cl_mem_lock, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), IS_NULL_PTR, and void().
Referenced by _gpu_early_cpu_fallback_if_unsupported(), and pixelpipe_process_on_GPU().
| int dt_dev_pixelpipe_cache_sync_cl_buffer | ( | int | devid, |
| void * | host_ptr, | ||
| void * | cl_mem_buffer, | ||
| const struct dt_iop_roi_t * | roi, | ||
| int | cl_mode, | ||
| size_t | bpp, | ||
| struct dt_iop_module_t * | module, | ||
| const char * | message | ||
| ) |
Synchronize between host memory and a pinned OpenCL image.
| devid | OpenCL device id. |
| host_ptr | Host pointer to read from / write to. |
| cl_mem_buffer | OpenCL image. |
| roi | Buffer dimensions. |
| cl_mode | CL_MAP_WRITE for host→device, CL_MAP_READ for device→host. |
| bpp | Bytes per pixel. |
| module | Module for debug logs. |
| message | Human-readable sync context. |
| void dt_dev_pixelpipe_cache_unref_hash | ( | dt_dev_pixelpipe_cache_t * | cache, |
| const uint64_t | hash | ||
| ) |
Find the entry matching hash, and decrease its ref_count if found.
| cache | |
| hash |
References _non_threadsafe_cache_get_entry(), dt_dev_pixelpipe_cache_ref_count_entry(), DT_PIXELPIPE_CACHE_HASH_INVALID, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_dev_pixelpipe_cache_t::entries, FALSE, dt_dev_pixelpipe_cache_t::lock, and dt_dev_pixelpipe_cache_t::queries.
Referenced by _clear_histogram_backbuf(), _refresh_global_histogram_backbuf_for_hash(), _update_backbuf_cache_reference(), dt_dev_clear_rawdetail_mask(), dt_dev_pixelpipe_cleanup(), dt_dev_pixelpipe_process(), and leave().
| void dt_dev_pixelpipe_cache_wrlock_entry | ( | dt_dev_pixelpipe_cache_t * | cache, |
| gboolean | lock, | ||
| struct dt_pixel_cache_entry_t * | entry | ||
| ) |
Lock or release the write lock on the entry.
| cache | |
| lock | TRUE to lock, FALSE to release |
References _pixel_cache_message(), darktable, DT_DEBUG_CONTROL_SIGNAL_RAISE, DT_PIXELPIPE_CACHE_HASH_INVALID, dt_pthread_rwlock_unlock, dt_pthread_rwlock_wrlock, DT_SIGNAL_CACHELINE_READY, dt_pixel_cache_entry_t::hash, dt_pixel_cache_entry_t::lock, darktable_t::signals, and TRUE.
Referenced by _cache_entry_materialize_host_data(), _cache_try_rekey_reuse_locked(), _gpu_early_cpu_fallback_if_unsupported(), _gpu_init_input(), _pixelpipe_cache_create_entry_locked(), dt_dev_pixelpipe_cache_get(), dt_dev_pixelpipe_cache_restore_cl_buffer(), dt_dev_pixelpipe_process_rec(), dt_drawlayer_cache_patch_alloc_shared(), dt_drawlayer_cache_patch_wrlock(), dt_drawlayer_cache_patch_wrunlock(), process(), and process_cl().
| void * dt_pixel_cache_alloc | ( | dt_dev_pixelpipe_cache_t * | cache, |
| struct dt_pixel_cache_entry_t * | entry | ||
| ) |
Actually allocate the memory buffer attached to the cache entry once you create it with dt_dev_pixelpipe_cache_get(). Sizes and everything are already saved in the entry, and the cache will have the needed space reserved.
| cache | |
| entry | the cache entry |
References _arena_alloc_with_defrag(), _log_arena_allocation_failure(), dt_pixel_cache_entry_t::data, FALSE, dt_pixel_cache_entry_t::hash, IS_NULL_PTR, dt_pixel_cache_entry_t::name, and dt_pixel_cache_entry_t::size.
Referenced by _cache_entry_materialize_host_data(), _gpu_early_cpu_fallback_if_unsupported(), _gpu_init_input(), dt_dev_pixelpipe_cache_get(), dt_dev_pixelpipe_cache_get_writable(), dt_pixel_cache_new_entry(), pixelpipe_process_on_CPU(), and pixelpipe_process_on_GPU().
| void * dt_pixel_cache_entry_get_data | ( | struct dt_pixel_cache_entry_t * | entry | ) |
Peek the host data pointer of a cache entry without allocating.
References dt_pixel_cache_entry_t::data.
Referenced by _cache_entry_materialize_host_data(), _lock_pipe_surface(), color_picker_apply(), dt_dev_pixelpipe_cache_gpu_device_buffer(), dt_dev_pixelpipe_cache_peek(), dt_dev_pixelpipe_cache_restore_host_payload(), dt_dev_pixelpipe_process_rec(), gui_post_expose(), mouse_moved(), pixelpipe_process_on_CPU(), pixelpipe_process_on_GPU(), scrolled(), and update_histogram().
| size_t dt_pixel_cache_entry_get_size | ( | struct dt_pixel_cache_entry_t * | entry | ) |
Peek the size (in bytes) reserved for the host buffer of a cache entry.
The pixelpipe cache treats dt_pixel_cache_entry_t as an internal/private structure. External users (such as the pixelpipe implementation) should not access struct fields directly.
This accessor is intentionally "peek-only": it does not allocate and it does not change ownership.
References dt_pixel_cache_entry_t::size.
Referenced by _lock_pipe_surface(), and _update_backbuf_cache_reference().
| void * dt_pixelpipe_cache_alloc_align_cache_impl | ( | dt_dev_pixelpipe_cache_t * | cache, |
| size_t | size, | ||
| int | id, | ||
| const char * | name | ||
| ) |
Allocate aligned memory tracked by the pixelpipe cache. This allows LRU cache entries to be evicted if needed to make room.
| cache | Pixelpipe cache to manage. |
| size | Buffer size in bytes. |
| id | Pipeline type owning the buffer. |
| name | Human-readable name. |
| void dt_pixelpipe_cache_free_align_cache | ( | dt_dev_pixelpipe_cache_t * | cache, |
| void ** | mem, | ||
| const char * | message | ||
| ) |
Free aligned memory allocated with dt_pixelpipe_cache_alloc_align_cache.
| cache | Pixelpipe cache to manage. |
| mem | Pointer to the buffer pointer. Set to NULL on successful free. |
| const char * dt_pixelpipe_cache_set_current_module | ( | const char * | module | ) |
Set the current module name for cache diagnostics (thread-local).
| module | Module op name or NULL to clear. |
References dt_pixelpipe_cache_current_module.
Referenced by dt_dev_pixelpipe_process_rec().