fix entries always out of date

This commit is contained in:
jacob 2025-05-15 04:01:45 -05:00
parent fafbfbfa6a
commit f7c994678d

View File

@ -258,7 +258,6 @@ struct sprite_startup_receipt sprite_startup(struct renderer_startup_receipt *re
G.evictor_mutex = sys_mutex_alloc();
G.evictor_cv = sys_condition_variable_alloc();
atomic_i32_eval_exchange(&G.evictor_cycle, 1);
G.evictor_thread = sys_thread_alloc(sprite_evictor_thread_entry_point, NULL, LIT("[P2] Sprite evictor"));
@ -400,7 +399,7 @@ INTERNAL void cache_entry_load_texture(struct cache_ref ref, struct sprite_tag t
struct sys_lock bin_lock = sys_mutex_lock_e(&bin->mutex);
{
for (struct cache_entry *old_entry = bin->first; old_entry; old_entry = old_entry->next_in_bin) {
if (old_entry->hash.v == e->hash.v) {
if (old_entry != e && old_entry->hash.v == e->hash.v) {
atomic_i32_eval_exchange(&old_entry->out_of_date, 1);
}
}
@ -708,7 +707,7 @@ INTERNAL void cache_entry_load_sheet(struct cache_ref ref, struct sprite_tag tag
struct sys_lock bin_lock = sys_mutex_lock_e(&bin->mutex);
{
for (struct cache_entry *old_entry = bin->first; old_entry; old_entry = old_entry->next_in_bin) {
if (old_entry->hash.v == e->hash.v) {
if (old_entry != e && old_entry->hash.v == e->hash.v) {
atomic_i32_eval_exchange(&old_entry->out_of_date, 1);
}
}
@ -1245,7 +1244,10 @@ INTERNAL SYS_THREAD_ENTRY_POINT_FUNC_DEF(sprite_evictor_thread_entry_point, arg)
struct evict_node *en = arena_push_zero(scratch.arena, struct evict_node);
en->cache_entry = n;
en->cache_bin = bin;
en->last_ref_cycle = refcount.last_ref_cycle * !is_out_of_date; /* If out of date then set last cycle to 0 */
en->last_ref_cycle = refcount.last_ref_cycle;
if (is_out_of_date) {
en->last_ref_cycle = -1;
}
++evict_array_count;
}
}
@ -1280,9 +1282,9 @@ INTERNAL SYS_THREAD_ENTRY_POINT_FUNC_DEF(sprite_evictor_thread_entry_point, arg)
struct sys_lock bin_lock = sys_mutex_lock_e(&bin->mutex);
{
struct cache_refcount refcount = *(struct cache_refcount *)atomic_u64_raw(&entry->refcount_struct);
if (refcount.count > 0 || (last_ref_cycle > 0 && refcount.last_ref_cycle != en->last_ref_cycle)) {
if (refcount.count > 0 || (last_ref_cycle >= 0 && refcount.last_ref_cycle != en->last_ref_cycle)) {
/* Cache node has been referenced since scan, skip node. */
} else if (cache_over_budget_target || last_ref_cycle == 0) {
} else if (cache_over_budget_target || last_ref_cycle < 0) {
/* Remove from cache bin */
struct cache_entry *prev = entry->prev_in_bin;
struct cache_entry *next = entry->next_in_bin;