Fix cache trimming loop in iced_wgpu::text

This commit is contained in:
Héctor Ramón Jiménez 2024-04-30 23:15:04 +02:00
parent c51b85e7ab
commit b276a603a1
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
2 changed files with 52 additions and 9 deletions

View file

@ -157,13 +157,16 @@ impl Storage {
target_size,
);
// Only trim if glyphs have changed
group.should_trim =
group.should_trim || upload.version != cache.version;
upload.text = Rc::downgrade(&cache.text);
upload.version = cache.version;
upload.group_version = group.version;
upload.transformation = new_transformation;
upload.buffer_cache.trim();
group.should_trim = true;
}
}
hash_map::Entry::Vacant(entry) => {
@ -213,19 +216,28 @@ impl Storage {
.retain(|_id, upload| upload.text.strong_count() > 0);
self.groups.retain(|id, group| {
if Rc::weak_count(&group.handle) == 0 {
let active_uploads = Rc::weak_count(&group.handle);
if active_uploads == 0 {
log::debug!("Dropping text atlas: {id:?}");
return false;
}
if group.should_trim {
log::debug!("Trimming text atlas: {id:?}");
if id.is_singleton() || group.should_trim {
log::debug!(
"Trimming text atlas: {id:?} (uploads: {active_uploads})"
);
group.atlas.trim();
group.version += 1;
group.should_trim = false;
// We only need to worry about glyph fighting
// when the atlas may be shared by multiple
// uploads.
if !id.is_singleton() {
group.version += 1;
}
}
true